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;
}
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();
};
//...
bool operator >= (Word& w1, Word& w2) {
return w1.frequency()>=w2.frequency();
};
Записал условие как
Код:
/*...*/ (*iter >= w) /*... */
Результат тот же. При этом, когда пишу что-нибудь вроде "iter->" Visual Studio показывает всплывающую подсказку с членам класса Word, т.е. по идее всё должно быть нормально.
В чём может быть проблема и как её решить?
Отсюда
Цитата:
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.
Может опытные сиплюсплюсники посоветуют, как лучше поступить.
Объявил итератор локально, заработало! Спасибо.