如何从向量中擦除元素并更新迭代器?

时间:2014-07-14 15:02:32

标签: c++ vector

我正在尝试从特定索引处的向量中删除对象。向量迭代器在整个程序中跟踪索引。在下面的代码中,第一个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;

}

3 个答案:

答案 0 :(得分:4)

erase使迭代器无效,因此您之后无法使用它。但它有助于在删除元素之后将元素返回到元素:

myVectorIterator = myVector.erase(myVectorIterator);

答案 1 :(得分:1)

这是因为对erase的调用使所有迭代器无效。想象一下,你有一些东西指向一个元素,那个元素消失了,你指的是什么?

更糟糕的是,这种行为依赖于高度依赖性。正确的方法是存储使用erase中的返回值,它将是向量中下一个元素的迭代器。

myVectorIterator = myVector.erase(myVectorIterator);

请注意,您现在必须删除下一行的增量(或者您将跳过一个项目。)

通常,在操作不同的STL容器时,您会在文档中看到给定的操作是否会对迭代器产生影响。如果你看看这个链接,你会看到对于vector :: erase来说就是这种情况:

"Iterators, pointers and references pointing to position (or first) and beyond are invalidated, with all iterators, pointers and references to elements before position (or first) are guaranteed to keep referring to the same elements they were referring to before the call."

在迭代器有效性方面,不同的容器可能有不同的保证。

答案 2 :(得分:0)

你必须这样做

myVectorIterator = myVector.erase(myVectorIterator);

它将删除当前迭代器,然后将下一个项目分配给它。