矢量迭代器不兼容:DEBUG

时间:2013-11-28 14:28:42

标签: c++ debugging vector iterator rogue-wave

为什么这段代码会给我错误:Vector迭代器不兼容

这段代码可以追溯到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;
        }
    }

1 个答案:

答案 0 :(得分: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;
}