C vector 迭代器失效原因

2021-07-25 03:44:51 字數 936 閱讀 9231

眾所周知,vector在記憶體中是順序儲存的,那麼當vector的長度增加時,也就是往裡面繼續pushback新的資料,當前塊的記憶體不夠,vector不得不重新申請一塊新的更大的記憶體,然後把之前的資料複製過來,再插入新的資料。

為了驗證這個可以看看下面的測試**:

上面的**非常簡單,都是在插入乙個新的資料後,輸出temp第乙個資料的記憶體位址,從執行截圖可以看到,三次的輸出都不一樣。

所以,當定義乙個vector的迭代器後,如果在這之後發生了插入新的資料,那麼這個迭代器將失效,因為迭代器是通過指標實現的,記憶體位址都發生了改變,迭代器當然會失效。

還有,如果不是插入資料,而是刪除資料,迭代器是否會失效呢?

新的測試**:

從上圖可以看出,tmep的記憶體位址並未發生改變,因此迭代器應該還是可以使用。很遺憾,我在vs2015上執行出錯,迭代器還是失效了。當我換了乙個編譯器之後,迭代器還是能繼續使用。這應該是由於vs更加嚴格的檢查機制吧。

為了避免刪除乙個資料後導致迭代器失效,應該在刪除時把返回值賦值給當前迭代器。

以上原理應該不限於vector,對其它類似的容器來說,同理。

C vector總結(迭代器失效深度討論)

vector的定義 建構函式宣告 介面說明 vector 重點 無參構造 vector size type n,const value type val value type 構造並初始化n個val vector const vector x 重點 拷貝構造 vector inputiterator...

迭代器失效 典型的迭代器失效

首先對於vector而言,新增和刪除操作可能使容器的部分或者全部迭代器失效。那為什麼迭代器會失效呢?vector元素在記憶體中是順序儲存,試想 如果當前容器中已經存在了10個元素,現在又要新增乙個元素到容器中,但是記憶體中緊跟在這10個元素後面沒有乙個空閒空間,而vector的元素必須順序儲存一邊索...

迭代器失效

迭代器 iterator 是乙個可以對其執行類似指標的操作 如 解除引用 operator 和遞增 operator 的物件,我們可以將它理解成為乙個指標。但它又不是我們所謂普通的指標,我們可以稱之為廣義指標,你可以通過sizeof vector iterator 來檢視,所佔記憶體並不是4個位元組...