Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема при работе с итераторами в векторе.

65K
09 апреля 2011 года
Kroops
9 / / 25.03.2011
Есть класс

 
Код:
class Word {
public:
    int frequency() { return frequency_; };
    //другие методы...
private:
    string text_; //текстовое представление слова
    int frequency_; //частота употребления слова
};


Есть класс
Код:
class Cell {
public:
    void Add (Word& w) {
        if (words.size()!=0) {
            iter=words.begin();
            while ( (iter->frequency() >= w.frequency()) && (iter!=words.end())) iter++;
            words.insert(iter, w);
        } else words.push_back(w);
    };
//другие методы...
private:   
    vector<Word> words;
    vector<Word>::iterator iter;
}


При выполнении программа вылетает с ошибкой, отладчик показывает, что косяк в следующем:
 
Код:
iter->frequency()   CXX0063: Error: overloaded operator -> not supported


Попробовал перегрузить оператор >=
 
Код:
friend bool operator >= (Word& w1, Word& w2);
//...
bool operator >= (Word& w1, Word& w2) {
    return w1.frequency()>=w2.frequency();
};


Записал условие как
 
Код:
/*...*/ (*iter >= w) /*... */


Результат тот же. При этом, когда пишу что-нибудь вроде "iter->" Visual Studio показывает всплывающую подсказку с членам класса Word, т.е. по идее всё должно быть нормально.

В чём может быть проблема и как её решить?
297
09 апреля 2011 года
koodeer
1.2K / / 02.05.2009
Отсюда
Цитата:
This effectively increases the vector size, which causes an automatic reallocation of the allocated storage space if, and only if, the new vector size surpasses the current vector capacity. Reallocations in vector containers invalidate all previously obtained iterators, references and pointers.


При вставке в вектор, если произошло перемещение вектора, итератор становится невалидным.
Следовательно, нужно заново получать начальное значение итератора. Но это выглядит неэффективным. Вероятно, в таком случае лучше будет пробегать по вектору циклом со счётчиком: words.
Может опытные сиплюсплюсники посоветуют, как лучше поступить.

65K
09 апреля 2011 года
Kroops
9 / / 25.03.2011
Объявил итератор локально, заработало! Спасибо.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог