vector迭代器失效的處理

2021-06-18 07:09:14 字數 1595 閱讀 3248

1、這裡先給幾個我們經常遇到的問題:(vs2012編譯器)

#include

#include

using namespace std;

int main()

}for (vector::iterator it = a.begin();it != a.end();++it)

cout<

這裡再呈現乙個問題:

vectora;

for (int i = 0;i < 4;i++)

a.push_back(i);

for (vector::iterator it = a.begin();it != a.end();++it)

}for (vector::iterator it = a.begin();it != a.end();++it)

cout<

對了,這裡還有乙個類似的問題:

vectora;

for (int i = 0;i < 4;i++)

a.push_back(i);

for (vector::iterator it = a.begin();it != a.end();++it)

}for (vector::iterator it = a.begin();it != a.end();++it)

cout<

從上面幾個問題中可以看到錯誤的型別一樣,那麼問題的根源在哪呢?

以vector為例,當我們插入乙個元素時它的預分配空間不夠時,它會重新申請一段新空間,將原空間上的元素複製到新的空間上去,然後再把新加入的元素放到新空間的尾部,以滿足vector元素要求連續儲存的目的。而後原空間會被系統撤銷或徵做他用,於是指向原空間的迭代器就成了類似於「懸垂指標」一樣的東西,指向了一片非法區域。如果使用了這樣的迭代器會導致嚴重的執行時錯誤就變得很自然了。這也是許多書上敘述vector在insert操作後「可能導致所有迭代器實效」的原因。但是想到這裡我不禁想到vector的erase操作的敘述是「會導致指向刪除元素和刪除元素之後的迭代器失效」。但是明顯感覺erase帶來失效要比insert來得輕得多。似乎「此失效非彼失效」,想想似乎也是這樣的:erase操作是在原空間上進行的,假設有乙個存有"12345"序列的vector容器原本指向3的迭代器在我刪除2之後無非變成指向4了,我只要注意別用到超過end位置的迭代器不就行了嗎?

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

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

能理解麼?

現在的問題就是怎麼避免這類問題了:

iter=vec.insert(iter);   

iter=vec.erase(iter);  

就是運用vector 函式的返回值來更新迭代器,一切就ok啦! 

對第乙個問題改動如下:

for (vector::iterator it = a.begin();it != a.end();)

else//為什麼要用else,自己思考啦

}對第二個問題改動如下:

for (vector::iterator it = a.begin();it != a.end();it++)

}

vector迭代器失效

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

vector的迭代器失效

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

vector中的迭代器失效

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