Erase導致的迭代器失效分析(C 11)

2021-06-27 06:28:29 字數 1171 閱讀 9215

迴圈中的erase:

(1)對於關聯式容器,erase之後什麼也不返回,則後續的迭代器無法向下,即不能在執行++it或it--操作。需要做的是在刪除時,進行it++,讓迭代器走下去就ok。

(2)對於序列式容器,erase之後返回的是下乙個迭代器,但會導致後續的迭代器全部失效,此時如果想要迴圈繼續,要儲存迭代器的返回值,從此處開始迭代。

無論哪種容器,常規的三段式for( )都不再適用。

在c++11中,erase返回下乙個迭代器,但之前的版本都返回void。erase本來就設計得不好,這下更容易讓人犯錯誤了。有缺陷的c++!

void erase( iterator pos )

;

(until c++11)

iterator erase( const_iterator pos )

;

(since c++11)

void erase( iterator first, iterator last )

;

(until c++11)

iterator erase( const_iterator first, const_iterator last )

;

(since c++11)

但目前很多編譯器還不支援c++11,或者只是部分支援。所以還是採用最穩妥的辦法好,即把 it++ 寫在迴圈之外。

(1)關聯式容器(以map為例)

for ( it=map.begin() ; it != map.end() ;  )

if ( candelete(it) )map.erase( it ++) ; //在c++11中,完全可以只寫map.erase( it ) 即可,但要先確認你的編譯器支援c++11,例如g++ 4.7.3就不行

else ++it ;

(2)序列式容器(以vector為例)

for( it = vector.begin() ; it != vector.end() ; )

if ( candelete(it) )   it = vector.erase( it ) ; //要把返回的值儲存在 it 中 ,否則 it 將處於無效狀態 ,之後的 ++it 將沒有意義。c++11關聯容器也可這麼寫

else ++ it ;

list中使用erase迭代器失效

當list使用erase時,會使當前被刪除元素的迭代器失效,如何解決這一問題。看c primer中是採取以下第一種方法 1 for list iterator iter l.begin iter l.end iter 在寫測試程式時,發現該種方法會有bug,即當我剛好滿足條件需刪去的值為list中第...

STL的erase 陷阱 迭代器失效總結

下面材料整理自internet 著作。stl中的容器按儲存方式分為兩類,一類是按以陣列形式儲存的容器 如 vector deque 另一類是以不連續的節點形式儲存的容器 如 list set map 在使用erase方法來刪除元素時,需要注意一些問題。1.list,set,map容器 在使用 lis...

迭代器失效小分析

stl中容器按儲存方式分為兩類 一是按陣列容器順序儲存的序列式容器 如 vector,deque 另一類是以不連續的節點形式儲存的容器 list set map 迭代器失效小例項 void printvector vector v cout endl void testvector 迭代器失效 對於...