迭代器失效,有兩個層面的意思:
1. 無法通過迭代器++,--操作遍歷整個stl容器。記作: 第一層失效。
這種情況下,通過++也已經到找不到迭代器的位址。
vector是個連續記憶體儲存的容器,如果vector容器的中間某個元素被刪除或從中間插入乙個元素, 有可能導致記憶體空間不夠用而重新分配一塊大的記憶體。
這個動作將導致先前獲取的迭代器,,第一層和第二層均失效。
造成失效的兩個函式:
insert(i, value)
在迭代器i前插入乙個元素value, 返回指向value迭代器
erase(i)
刪除迭代器i位置的元素, 返回指向後乙個元素的迭代器
避免失效的方法:
i = insert(i, value)
i = erase(i)
造成失效的原因是因為記憶體的重新分配, 保留下來的迭代器不再指向容器中原來的元素…
下面我們來看一下執行這兩個操作時記憶體分配的具體情況:
1. erase操作
//erase操作
#include
#include
using namespace std;
int main();
int cnt = 0;
int flag = 0;
for(vector::iterator i = q.begin(); i != q.end(); ++i)
return 0;}1
2345
6789
1011
1213
1415
1617
1819
2021
22output:
10xc72158
20xc7215c
40xc72160
//可以看出記憶體仍然是連續儲存的
50xc72164
60xc72168
70xc7216c
80xc72170
90xc72174
100xc7217812
3456
78910
1112
1314
1516
1718
輸出結果分析:
當刪除第3個元素以後我們發現第四個元素是緊鄰第二個元素的(剛好差乙個int的記憶體)
也就是說vector執行erase(i)後會將迭代器i之後的元素逐個向前移動乙個type單位
這也就是i及i之後所有迭代器失效的原因…
STL中迭代器失效問題
對於vector deque等連續儲存的容器來說,插入元素 insert 或者刪除元素 erase 會導致後邊的迭代器都失效,解決方法是,erase iter 會返回下乙個有效迭代器的值,刪除元素時用將當前迭代器賦值為erase的返回值,系統會自動將迭代器的指向修改的。for iter cont.b...
STL迭代器失效的問題
內部資料結構 連續儲存,例如陣列。隨機訪問每個元素,所需要的時間為常量。在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve 成員函式來管理記憶體。迭代器失效 插入 vecto...
STL 迭代器失效問題
最近在專案開發中,遇到乙個異常,經過測試,發現是迭代器失效問題,於是稍微總結了一下。vector迭代器失效測試 測試程式 void vectortest vector int iterator iter for iter container.begin iter container.end iter...