STL迭代器失效

2021-06-18 21:51:28 字數 776 閱讀 3362

vector:

1.當插入 (push_back)乙個元素後,end操作返回的迭代器肯定失效。

此時first和end操作返回的迭代器都會失效。

3.當進行刪除操作(erase,pop_back)後,指向刪除點的迭代器全部失效;指向刪除點後面的元素的迭代器也將全部失效。

deque迭代器的失效情況:

1.在deque容器首部或者尾部插入元素不會使得任何迭代器失效。

2.在其首部或尾部刪除元素則只會使指向被刪除元素的迭代器失效。

3.在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器失效。

list/set/map

1.刪除時,指向該刪除節點的迭代器失效

解釋:首先對於vector而言,新增和刪除操作可能使容器的部分或者全部迭代器失效。那為什麼迭代器會失效呢?vector元素在記憶體中是順序儲存,試想:如果當前容器中已經存在了10個元素,現在又要新增乙個元素到容器中,但是記憶體中緊跟在這10個元素後面沒有乙個空閒空間,而vector的元素必須順序儲存一邊索引訪問,所以我們不能在記憶體中隨便找個地方儲存這個元素。於是vector必須重新分配儲存空間,用來存放原來的元素以及新新增的元素:存放在舊儲存空間的元素被複製到新的儲存空間裡,接著插入新的元素,最後撤銷舊的儲存空間。這種情況發生,一定會導致vector容器的所有迭代器都失效。

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

STL 迭代器失效

迭代器失效 指向不再存在的元素的迭代器。無效迭代器的使用未定義,可能會導致嚴重的執行錯誤。眾所周知當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素 可能 會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的...

stl 迭代器失效

1 對於基於連續記憶體的容器,容器元素的增刪,有可能會導致迭代器的失效。考慮 int main int argc,char ar 2 通過memory可以記憶體的變化,刪除之前是 1 2 3 刪除之後是2 3,刪除iter1會導致迭代器iter2和ri失效。迭代器和引用,底層都是指標,刪除iter1...

STL 迭代器失效問題

最近在專案開發中,遇到乙個異常,經過測試,發現是迭代器失效問題,於是稍微總結了一下。vector迭代器失效測試 測試程式 void vectortest vector int iterator iter for iter container.begin iter container.end iter...