先看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 演算...