關於迭代器失效的幾種情況

2021-09-22 18:24:35 字數 1012 閱讀 2795

一、序列式容器迭代器失效

1、順序容器:

2、對於序列式容器vector、deque

當當前元素iterator刪除後(就是刪除乙個元素後),從起始位置到當前刪除位置的迭代器是正常的,其後的所有元素的迭代器都會失效,這是因為vector、deque都是連續的儲存一段空間,所以當對其進行erase操作時,其後的每乙個元素都會向前乙個位置。

解決辦法:當刪除元素的時候,必須用erase的返回值更新一些當前的迭代器 比如:it = vec.erase(it);

當向容器中新增乙個元素的時候,所有的迭代器都失效了(因為隨著元素的增加,容器底層的記憶體可能會擴大所有的迭代器完全失效)

解決辦法:it = vec.push(it)

對於deque迭代器失效的總結

(1)插入到除首尾位置之外的任何位置都會導致迭代器、指標和引用都會失效

(2)如果在首位位置新增元素,迭代器會失效,但是指標和引用不會失效

(3)如果在首位置為之外的任何位置刪除元素,那麼指向除了被刪除元素外其他元素的迭代器全部失效

(4)在其首部或尾部刪除元素則只會使指向被刪除元素的迭代器失效

二、關聯式容器迭代器失效

對於關聯容器(如map,set,multimap,multiset),刪除當前的iterator,僅僅會使當前的iterator失效,只要在erase時,遞增iterator即可。這是因為map之類的容器,使用了紅黑樹來實現,插入、刪除乙個結點不會對其它結點造成影響。erase迭代器只是被刪除元素的迭代器失效,但是返回值為void,所以要採用erase(iter++)的方式刪除迭代器。採用這種方法,迭代器就沒有問題了

對erase(it++)的執行過程進行解釋:這條語句分為三個步驟,(1)先把iter傳值到erase裡面,然後iter自增,然後執行erase,所以iter在失效前已經自增了。

map是關聯容器,以紅黑樹或者平衡二叉樹組織資料,雖然刪除了乙個元素,整棵樹也會調整,以符合紅黑樹或者二叉樹的規範,但是單個結點在記憶體中的位址沒有變化,變化的是各個結點之間的指向關係

C STL迭代器失效的幾種情況

大神部落格 陣列型資料結構 該資料結構的元素是分配在連續的記憶體中,insert和erase操作,都會使得插入點和刪除點之後的元素變動位置,所以,插入點和刪除掉之後的迭代器全部失效,也就是說insert iter 和erase iter 之後進行iter 是錯誤的。解決方法 erase iter 的...

C 迭代器失效的幾種情況總結

一 序列式容器 陣列式容器 對於序列式容器 如vector,deque 序列式容器就是陣列式容器,刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的記憶體,刪除乙個元素導致後面所有的元素會向前移動乙個位置。所以不能使用erase ite...

常見幾種stl迭代器失效情況總結

思前想後還是先多鞏固基礎在去學習新的技術為好,近期會整理一些對基礎知識的總結 迭代器失效是因為向容器插入或者刪除元素導致容器的空間變化或者說是次序發生了變化,使得原迭代器變得不可用。因此在對stl迭代器進行增刪操作時,要格外注意迭代器是否失效。下面介紹幾種常用的迭代器失效情況 list map se...