为什么这段代码会给我错误: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;
}
}
答案 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;
}