簡體   English   中英

如何從向量中刪除元素並更新迭代器?

[英]How to erase element from vector and update iterator?

我正在嘗試從特定索引處的向量中刪除對象。 向量迭代器會跟蹤整個程序中的索引。 在下面的代碼中,第一個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;

}

erase會使迭代器無效,因此您以后將無法使用它。 但是在刪除元素之后,它有助於將迭代器返回到元素:

myVectorIterator = myVector.erase(myVectorIterator);

這是因為對擦除的調用使所有迭代器無效。 想象一下,您有一個指向某個元素的東西,而該元素消失了,您應該指向什么?

更糟糕的是,該行為高度依賴於實現。 正確的方法是存儲使用從擦除返回的值,該值將是向量中下一個元素的迭代器。

myVectorIterator = myVector.erase(myVectorIterator);

請注意,您現在必須刪除下一行的增量(否則您將跳過一個項目。)

通常,在處理不同的STL容器時,您會在文檔中看到給定的操作是否會對迭代器產生影響。 如果您看一下此鏈接,將會發現vector :: erase的情況是這樣的:

“指向位置(或第一個)及以后的迭代器,指針和引用無效,所有保證位置(或第一個)之前的元素的迭代器,指針和引用都保證始終引用與調用前相同的元素。 “

關於迭代器有效性,不同的容器可能具有不同的保證。

你必須這樣做

myVectorIterator = myVector.erase(myVectorIterator);

它將刪除當前的迭代器,然后將下一項分配給它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM