Векторные итераторы несовместимы: DEBUG

Почему этот фрагмент кода выдает ошибку: векторные итераторы несовместимы

Этот фрагмент кода восходит к файлу 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;
}
}

2

Решение

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;
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]