/ / kasowanie elementu w wektorze przez iterator jest niepoprawne, ale nie powoduje awarii - c ++, wektor, iterator

wymazać element w wektorze przez iterator niepoprawny, ale NIE zawiesza się - c ++, wektor, iterator

int main()
{
vector<int> v;
v.reserve(10);
for(int i=0;i<10;i++)
v.push_back(i);

for(vector<int>::const_iterator iter=v.begin();iter!=v.end();iter++) {
if(*iter==5)
v.erase(iter);
}

for(vector<int>::const_iterator iter=v.begin();iter!=v.end();iter++)
cout<<*iter<<endl;

return 0;
}

Jestem pewien, że iter to. Powinno to wyglądać następująco, inaczej się zawiesi.

for(vector<int>::const_iterator iter=v.begin();iter!=v.end();) {
if(*iter==5)
iter=v.erase(iter);
else
iter++;
}

Jednak gdy uruchamiam pierwszy program, wyświetla on: 0,1,2,3,4,6,7,8,9. Czytałem primer C ++ raz po raz i googlowałem, wciąż czułem się zagubiony.

Odpowiedzi:

3 dla odpowiedzi № 1

Od wymazać:

Unieważnia iteratory i odwołania w punkcie wymazywania lub po nim, w tym iterator end ().

Zasadniczo oznacza to, że pierwszym fragmentem kodu jest Niezdefiniowane zachowanie.

Ponieważ jest to zachowanie nieokreślone, wszystko może się zdarzyć (awaria nie jest wymagana, program może zachowywać się zgodnie z oczekiwaniami do pewnego momentu w przyszłości, gdy nagle się zawiesi).