Здравствуйте, SmileIlya, Вы писали:
SI>перевожу с VC 5.0 на VC 2008
SI>есть конструкция
конструкция некорректная, ибо внутри цикла инвалидируются итераторы вектора
вам уже посоветовали работать с индексами, а не с итераторами
я могу вам посоветовал в цикле сделать копирование элементов в другой вектор. это может сделать ваш алгоритм более ясным и корректным
в таком духе:
std::vector<T*> newV;
std::vector<T*>::const_iterator it = V.begin();
for (; it != V.end(); ++it)
{
if (условие)
newV.push_back(значение);
}
V.swap(newV);
Здравствуйте, SmileIlya, Вы писали:
SI>пробовал и такое, если бы не было bush_back все прокатывало... как только его(push_back) добавляешь, значение it меняются сразу и erase не работает
разумеется итераторы после push_back'а у вектора могут стать невалидными в силлу того, что например произойдёт переаллокация памяти, запомните индекс элемента, и удаляйте по нему.
Здравствуйте, SmileIlya, Вы писали:
SI>перевожу с VC 5.0 на VC 2008
SI>есть конструкция SI>std::vector<T*>::iterator it = V.begin(); SI>for (; it != V.end(); ++it) SI>{ SI> if(условие) SI> V.push_back(значение); SI> V.erase(it); SI> --it; SI>} SI>в VC 5.0 все прокатывало на ура.... vc2008 компилится нормально, но вот работать отказывается, пишет при --it ошибку и падает. SI>
так делать нельзя. после удаления элемента в векторе итераторы могут стать невалидными.
есть конструкция
std::vector<T*>::iterator it = V.begin();
for (; it != V.end(); ++it)
{
if(условие)
V.push_back(значение);
V.erase(it);
--it;
}
в VC 5.0 все прокатывало на ура.... vc2008 компилится нормально, но вот работать отказывается, пишет при --it ошибку и падает.
Здравствуйте, SmileIlya, Вы писали:
SI>перевожу с VC 5.0 на VC 2008
SI>есть конструкция SI>std::vector<T*>::iterator it = V.begin(); SI>for (; it != V.end(); ++it) SI>{ SI> if(условие) SI> V.push_back(значение); SI> V.erase(it); SI> --it; SI>} SI>в VC 5.0 все прокатывало на ура.... vc2008 компилится нормально, но вот работать отказывается, пишет при --it ошибку и падает. SI>
Быть может индексы ?
for(int i = 0; i < (int)V.size(); ++i)
{
if(...)
V.push_back(...);
V.erase(V.begin() + i--);
}
Хотя выглядит все это как-то очень подозрительно....
Не проще завести новый вектор, сложить в него все, что нужно, и потом свапнуть с исходным?
Здравствуйте, SmileIlya, Вы писали:
SI>перевожу с VC 5.0 на VC 2008
SI>есть конструкция SI>std::vector<T*>::iterator it = V.begin(); SI>for (; it != V.end(); ++it) SI>{ SI> if(условие) SI> V.push_back(значение); SI> V.erase(it); SI> --it; SI>} SI>в VC 5.0 все прокатывало на ура.... vc2008 компилится нормально, но вот работать отказывается, пишет при --it ошибку и падает. SI>
И какое желаемое поведение? Оно в результате должно удалить из вектора все элементы или зациклиться, вечно вставляя и удаляя удовлетворяющие условию элементы?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
C. Мейерс. "Эффективное использование STL"
Совет №9, стр. 53.
"...поскольку для контейнеров vector. string и deque в результате вызова
erase становятся недействительными все итераторы, указывающие на удаляемый
элемент. Кроме того, недействительными становятся все итераторы после
удаляемого элемента.
...
Мы должны воспользоваться возвращаемым значением erase, которое содержит
именно то, что нам требуется — действительный итератор, который указывает на
элемент, следующий за удалённым.
for (ПоследовательныйКонтейнер<T>::iterator=c.begin(); i!=c.end()
{
if (Условие(*i))
i=c.erase(i);
else
++i;
}
"
Posted via RSDN NNTP Server 2.1 beta
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Da, uzhe ponyal, chto ya dlya map pisal, a obsuzhdalsya vector
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, sgenie, Вы писали:
S>>А я бы сделал вот так: S>> c.erase(i++);
U>так можно делать только для ассоциативных контейнеров, но не для последовательных U>читайте, что написал Smooky