Плохая идея стирать из вектора, итерации по нему. Просто отфильтруйте его.
void function(std::vector <class*> & vector)
{
std::vector <class*>::iterator from= vector.begin();
std::vector <class*>::iterator to= from;
for(; from != vector.end(); ++from)
{
if((*from)->value == 1) continue;
// it should be (*from) or use boost::ptr_vector
*(to++)=*from;
}
vector.erase(to, vector.end());
Display(vector);
return;
}
Это функциональность, точно идентичная коду Ylisar. ИМХО это лучше всего для вектора, если вы всегда что-то удаляете, но если удаление очень редко (для всего одного вектора), используйте версию Бенджамина Линдли.
Независимо от оптимизации может быть, вы можете фильтровать только если он у вас есть что-то, чтобы стереть:
void function(std::vector <class*> & vector)
{
std::vector <class*>::iterator to= vector.begin();
for(; to != vector.end(); ++to)
{
if((*to)->value == 1)
{
std::vector <class*>::iterator from=to;
for(++from; from != vector.end(); ++from)
{
if((*from)->value == 1) continue;
*(to++)=*from;
}
vector.erase(to, vector.end());
break;
}
}
Display(vector);
return;
}
Если вам не нужно, чтобы сохранить порядок, вы можете копировать зад минимальной копии перегрева:
void function(std::vector <class*> & vector)
{
std::vector <class*>::iterator to= vector.begin();
std::vector <class*>::iterator from=vector.end();
if(to == from) return;
for(;;)
{
if((*to)->value == 1) // need skip value from begin
{
for(--from; from != to; --from)
{
if((*from)->value == 1) continue; // need skip value from end
*to=*from;
++to; // copied, move to next
}
}
else
{
++to; //preserved, move to next
}
if(to == from)
{
vector.erase(to, vector.end());
break;
}
}
Display(vector);
return;
}
Попробуйте использовать его = vector.erase (it), но не увеличивайте его при назначении из функции стирания, поскольку в противном случае вы пропустите пункты –
Стандартная библиотека не гарантирует, что итераторы действительны, когда коллекция изменяется каким-либо образом. Хорошей новостью является то, что всегда есть способы справиться с этим и, как правило, более кратким образом, например. см. ответ Илисара. –
@DeepYellow: стандарт дает некоторые гарантии для некоторых операций над некоторыми контейнерами; в этом случае он гарантирует, что итераторы и ссылки на элементы * до * точки стирания остаются vaild. Очевидно, что итераторы и ссылки на стертый элемент всегда будут признаны недействительными для любого контейнера. –