STL中的迭代器失效的問題

2021-09-23 20:35:38 字數 1242 閱讀 9606

迭代器失效,有兩個層面的意思:

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...