2

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

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

1 回答 1

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;
}
于 2013-11-28T14:44:50.913 回答