STL容器如何正確刪除元素(迭代器失效問題)

2022-10-08 19:00:11 字數 749 閱讀 3898

先看2段**說明問題:

associcontainer c;  //關聯容器:map multimap set multiset

for(auto it=c.begin();it!=c.end();)

if(badvalue(*it))

c.erase(it++);  //關聯容器erase返回值為void

else

++it;

說明:c.erase(it++) 會把it的舊值傳給erase,但在erase開始執行之前it會自增,正好符合我們的期望。關聯容器這樣寫沒有任何問題,迭代器不會失效

seqcontainerc;  //順序容器:vector list deque

for(auto it=c.begin();it!=c.end();)

if(badvalue(*it))

it=c.erase(it);  //順序容器的erase返回的是下乙個迭代器

else

++it;

說明:此處不能再寫 c.erase(it++) 因為執行c.erase(it)之後,迭代器it及其之後的所有迭代器都失效了,無法再使用;不過好在它會返回下乙個迭代器所以直接利用他的返回值給it再賦值即可

根本原因是順序容器是連續記憶體,你erase乙個元素之後,後面的元素都要向前移動乙個位置,不僅迭代器it失效,包括後面的所有迭代器都失效;同樣你也能想象,insert元素也是同樣的道理。

而關聯容器是用二叉樹儲存的,erase只會使得it本身失效不會影響後面的迭代器。

STL容器之刪除元素,迭代器失效

一.種類 值得注意的是,陣列可以和stl演算法配合,因為指標可以當作陣列的迭代器使用。二.刪除元素 如果想刪除東西,記住remove演算法後,要加上erase 所謂刪除演算法,最終還是要呼叫成員函式去刪除某個元素,但是因為remove並不知道它現在作用於哪個容器,所以remove演算法不可能真的刪除...

STL容器之刪除元素,迭代器失效

部落格 一.種類 值得注意的是,陣列可以和stl演算法配合,因為指標可以當作陣列的迭代器使用。二.刪除元素 如果想刪除東西,記住remove演算法後,要加上erase 所謂刪除演算法,最終還是要呼叫成員函式去刪除某個元素,但是因為remove並不知道它現在作用於哪個容器,所以remove演算法不可能...

STL容器 刪除元素,迭代器失效,選擇時機

一.種類 值得注意的是,陣列可以和 stl演算法配合,因為指標可以當作陣列的迭代器使用。二.刪除元素 如果想刪除東西,記住 remove 演算法後,要加上 erase 所謂刪除演算法,最終還是要呼叫成員函式去刪除某個元素,但是因為 remove 並不知道它現在作用於哪個容器,所以 remove 演算...