[英]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.