容器呼叫了自己的erase方法,接下來怎麼辦

2021-09-30 14:52:20 字數 1000 閱讀 8943

今天寫乙個小例子時遇到了乙個如下的問題:我要遍歷乙個vector,但遍歷過程中某些條件具備的時候我就打算刪除復合條件的元素。刪除時使用erase永久刪除,然後繼續完成遍歷(這個情況在effective c++上面看到過,但沒找到,還記得有解決辦法的,所以就自己想辦法了)。比如現在我打算在遍歷遇到2的時候直接刪除2,刪除後的陣列還可以當做它用。

int b=;

vectora(b,b+5);

for (vector::iterator i=b.begin();i!=b.end();i++)

cout<

}發現這樣只能輸出1,之後就非法訪問了。原因在於erase刪除迭代器所指向的元素後,迭代器便不再有效。

for (vector::iterator i=b.begin();i!=b.end();i++)

cout<

}發現這樣也不行,因為continue只是將此次迴圈還未執行完的部分跳過。但並不能阻止i++的執行。正是i++導致了問題。因為i++使用了已經失效的原來被刪除的迭代器。為了避免這樣的錯誤,所以要更新迭代器。由於erase自動返回被刪除迭代器的下乙個迭代器。所以新的程式如下

for (vector::iterator i=b.begin();i!=b.end();i++)

else

cout<

}此時輸出的是 : 145 ,3哪去了呢?因為遇到2時,刪除了指向2的迭代器,並更新迭代器使之指向3,但接下來執行了i++,這樣就跳過了對3的判斷和使用。即3被遮蔽了。

從上面可以看出i++是不可避免的問題**。所以現在考慮讓i++可被控制,讓它當道迴圈體內部即可,也就是可以用while迴圈來實現。

vector::iterator i=b.begin();

while(i!=b.end())

cout<

i++;

}這樣便可實現目的了,輸出如下

關於List容器的erase

之前在程式裡面使用了list容器,其中用到了erase 函式,之前一直沒出現問題,這兩天突然莫名奇妙。花了點時間,搞清楚了erase 函式的機理。常用的刪除容器中元素的方法是如下 方法1 list int list list int iterator iter for iter list.begin...

map容器的erase用法

刪除指定map中指定key的元素 include include include include using namespace std int tmain int argc,tchar argv 執行結果為 ret 1 ret 0 分析 刪除map中指定key的元素會返回刪除元素的數量,如果key...

multiset容器erase函式的誤用

從缺陷中學習c c 第3章庫函式問題,本章主要介紹庫函式的使用中會遇到的問題。使用庫函式可以降低軟體開發的難度,提高 編寫的效率。本節為大家介紹multiset容器erase函式的誤用。2013 11 28 15 29 收藏 分享 3.16 multiset容器erase函式的誤用 示例 int m...