STL容器迭代器失效之案例 vector

2021-09-27 07:12:16 字數 681 閱讀 2865

對於序列式容器(如vector,deque),序列式容器就是陣列式容器,刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的記憶體,刪除乙個元素導致後面所有的元素會向前移動乙個位置。所以不能使用erase(iter++)的方式,還好erase方法可以返回下乙個有效的iterator。

vectorvec=;

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

else

}

對於序列式容器,比如vector,刪除當前的iterator會使後面所有元素的iterator都失效。這是因為順序容器記憶體是連續分配(分配乙個陣列作為記憶體),刪除乙個元素導致後面所有的元素會向前移動乙個位置。(刪除了乙個元素,該元素後面的所有元素都要挪位置,所以,iter++,已經指向的是未知記憶體)。

vectorvec=;

for(auto it = vec.begin(); it != vec.end(); it++)

}

總結:vector是乙個順序容器,在記憶體中是一塊連續的記憶體,當刪除乙個元素後,記憶體中的資料會發生移動,以保證資料的緊湊。所以刪除乙個資料後,其他資料的位址發生了變化,之前獲取的迭代器根據原有的資訊就訪問不到正確的資料。

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的迭代器在記憶體重新分配時將失...