我正在尝试从特定索引处的向量中删除对象。向量迭代器在整个程序中跟踪索引。在下面的代码中,第一个IF语句完美地工作。但是,如果迭代器指向除最后一个元素之外的任何地方,我将从向量中删除该元素,然后递增迭代器。该程序崩溃并说“迭代器不可递增”。
我多次运行调试器,一切看起来都正确,所以我看不到我错过了什么?
vector<Card> myVector; //container to hold collection of cards.
vector<Card>::iterator myVectorIterator; //points to each "card" in the collection.
Card Collection::remove()
{
if (myVectorIterator== myVector.end()-1) { //at the last card
//erase the "current" card
myVector.erase(myVectorIterator);
//update to the first card.
myVectorIterator= myVector.begin();
}
else
{
myVector.erase(myVectorIterator);
//crashes here!
myVectorIterator++;
}
return *myVectorIterator;
}
答案 0 :(得分:4)
erase
使迭代器无效,因此您之后无法使用它。但它有助于在删除元素之后将元素返回到元素:
myVectorIterator = myVector.erase(myVectorIterator);
答案 1 :(得分:1)
这是因为对erase的调用使所有迭代器无效。想象一下,你有一些东西指向一个元素,那个元素消失了,你指的是什么?
更糟糕的是,这种行为依赖于高度依赖性。正确的方法是存储使用erase中的返回值,它将是向量中下一个元素的迭代器。
myVectorIterator = myVector.erase(myVectorIterator);
请注意,您现在必须删除下一行的增量(或者您将跳过一个项目。)
通常,在操作不同的STL容器时,您会在文档中看到给定的操作是否会对迭代器产生影响。如果你看看这个链接,你会看到对于vector :: erase来说就是这种情况:
在迭代器有效性方面,不同的容器可能有不同的保证。
答案 2 :(得分:0)
你必须这样做
myVectorIterator = myVector.erase(myVectorIterator);
它将删除当前迭代器,然后将下一个项目分配给它。