2013-11-28 4 views
2

Почему этот кусок кода дает мне ошибку: Vector итераторы несовместимымиVector итераторы несовместимыми: 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; 
     } 
    } 

ответ

5

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; 
} 
+0

Ах! Да, слегка контр-интуитивно в исходном коде 'end()' вызывается первым (согласно моему отладчику), а затем 'erase()' делает недействительным итератор, возвращаемый 'end()'. –

+0

Удивительные парни, я это вижу. Спасибо за объяснение. – melbah

 Смежные вопросы

  • Нет связанных вопросов^_^