STL容器迭代器失效問題討論

2021-09-07 16:21:01 字數 1021 閱讀 4786

vector迭代器的幾種失效的情況: 

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

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

deque迭代器的失效情況: 在c++primer一書中是這樣限定的:

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

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

3、在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器失效。但是:我在vs2005測試發現第一條都不滿足,不知為何?等以後深入stl以後慢慢的領會吧!

只有list的迭代器好像很少情況下會失效。也許就只是在刪除的時候,指向被刪除節點的迭代器會失效吧,其他的還沒有發現。

先看兩條規制:

1、對於節點式容器(map, list, set

)元素的刪除,插入操作會導致指向該元素的迭代器失效,其他元素迭代器不受影響。

2、對於順序式容器(vector)元素的刪除、插入操作會導致指向該元素以及後面的元素的迭代器失效。

有的朋友肯定會問, m.erase(it++);就不會產生迭代器失效麼? 確實不會! 為什麼呢? 這樣從it++說起, 為了簡便起見, 我們用p++來代替吧。 看程式:

#include 

using namespace std;  

int main()    

大家都知道, 結果為a.  但是, 很多人錯誤地以為是先執行*p, 然後執行p++, 其實, 這是個天大的誤解。 大家可以查一下*和++的執行順序, 雖然*和++的優先順序相同, 但此處採取的是右結合方式, 實際上先執行的是p++, 不過, p++的返回值是原來的p, 也就是說, *p++的值還是a.     所以, 在m.erase(it++);中,it++先執行, 此時還沒有erase, 程式自然不會崩潰. 當it++執行完後, 已經指向了下乙個元素了, 但it++的返回值還是當前元素, 此時再刪除它, 合情合理。

STL容器迭代器失效問題

眾所周知當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素 可能 會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的操作 view plaincopy to clipboardprint?iter vec....

STL容器迭代器失效問題

眾所周知當使用乙個容器的insert或者erase函式通過迭代器插入或刪除元素 可能 會導致迭代器失效,因此很多建議都是讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的操作 view plaincopy to clipboardprint?iter vec....

STL容器迭代器失效時機

內部資料結構 陣列。隨機訪問每個元素,所需要的時間為常量。在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve 成員函式來管理記憶體。vector的迭代器在記憶體重新分配時將失...