Почему этот фрагмент кода выдает ошибку: векторные итераторы несовместимы
Этот фрагмент кода восходит к файлу Rogue Wave tpordvec.h
std::vector<T*> v;
const T* a // Where T is a template Class
for (std::vector<T*>::iterator p = v.begin(); p != v.end(); p++)
{
if (**p == *a)
{
T* temp = *p;
if ( v.erase(p) == v.end()) //ASSERTION ERROR HERE
return NULL;
return temp;
}
}
http://en.cppreference.com/w/cpp/container/vector/erase
Итераторы и ссылки на стертые элементы и элементы между ними и концом контейнера становятся недействительными. Последний итератор также становится недействительным.
Следовательно, если vector.end()
оценивается до vector.erase()
а также vector.erase()
действительно стирает и тем самым делает недействительными итераторы до end()
Призыв к operator==()
будет между двумя несовместимыми итераторами.
Примерно так будет лучше:
auto it = v.erase(p);
if ( it == v.end())
{
return NULL;
}
Других решений пока нет …