初夏小談 vector中迭代器失效問題

2021-09-19 09:07:46 字數 2124 閱讀 1489

在模擬vector中會發生一種錯誤,程式崩潰。經過除錯發現當使用迭代器時當指向的空間發生擴容後,在對用迭代器指向的空間進行解引用時會發生程式崩潰。在vector中,我們知道迭代器可以看作是原生態的指標,那麼對指標進行解應用發生崩潰,就說明了對一塊不屬於當前指標的空間進行了解引用。

在vector中使用迭代器發生崩潰會存在兩種情況:

一、根據上面所說的情況就可以總結為:當容量發生改變時就有可能發生迭代器失效。例如(進行插入元素,增加有效元素個數,擴容時等等)可能引起另闢空間進行搬移資料就會產生迭代器失效的問題。

例子:

void testvector5()

; for (auto& e : v)

vector::iterator it = v.begin();

v.reserve(16);

cout << *it << endl;

}

執行結果:

產生崩潰的原因就是:原來的空間進行擴容後,就在另一塊記憶體上開闢了一片相應要求的空間並且將原來記憶體上的資料搬過去。但是it依舊是還是指向原來的空間上,原來的空間已經被釋放。如果再次對it進行操作,就會崩潰,你想對釋放的空間進行解引用嗎?那是不可能的呵呵。

針對上述問題解決辦法

就是因為迭代器的指向不能自動跟著變化所以就進行手動跟上對應空間。

void testvector5()

; for (auto& e : v)

cout << endl;

vector::iterator it = v.begin();

v.reserve(16);

it = v.begin();

cout << "*it = " << *it << endl;

}

執行結果:

二、第二種情況就是在對迭代器所指向的元素刪除時(erase),就會崩潰

**例子:

void testvector6()

; for (auto& e : v)

cout << endl;

vector::iterator it = v.begin();

while (it != v.end())

}

結果顯示:

這是因為:當刪除第乙個資料後,所有資料都往前移動一次。但是it雖然指向第二個元素。但是它依然去找尋已經刪除第乙個資料,顯然不會找到,迭代器也太執著了。就發生崩潰。

解決辦法:就是每刪除乙個資料,就重新將迭代器指向第乙個位置。脫離已故的主人吧,該換新主人了。呵呵。

void testvector6()

; for (auto& e : v)

cout << endl;

vector::iterator it = v.begin();

while (it != v.end())

cout << endl;

}}

執行結果:

總結一下迭代器失效問題:本質指標,指標所指向的空間失效了,從而指標指向了一塊非法的空間。

珍&原始碼

vector迭代器失效

c 面試題經常會背問到vector和list的區別,其中就有乙個問題就困擾我們的,面試官說vector在進行插入和刪除元素的時候迭代器會失效,list不會,那這邊由我來給大家舉個列子 include include using namespace std int main include inclu...

vector中的迭代器失效

vector容器 迭代器的失效 如果給容器進行增添 刪除的時候改變了容量的大小,這個時候迭代器任然指向原來的那個空間的那個位置,但是原來的空間經過容量的變化之後已經被改變了,所以這個時候迭代器會出現失效的情況,如果想要解決這個問題的話,可以通過接受返回值來讓迭代器指向新的空間。示例 include ...

vector的迭代器失效

大家知道vector容器與陣列的不同之處在於,vector可以自動擴容它的容量,是乙個動態的陣列,而我們的普通陣列的容量時固定死的。當vector內元素的數量等於vector容量的時候,再向vector中插入資料,vector會自動申請一塊兒更大的記憶體空間,並將原來的資料拷貝過去,並存將新的元素插...