2013-11-28 184 views
2

爲什麼這段代碼給我的錯誤:矢量迭代器不兼容矢量迭代器不兼容: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