vector的迭代器失效

2021-09-11 21:05:08 字數 1144 閱讀 9744

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

下面是在vs2017上的例子的執行結果:

可見插入資料後,vector的首元素位址發生了改變,也就是說該vector的位置發生了改變。

看上圖,可知原vector的容量為0,插入乙個資料以後,容量擴大到了1,而迭代器 it的位址是未插入元素之前的位址,插入元素後,vector由於新開闢空間導致vector的位址發生了變化,原記憶體空間被釋放,導致用迭代器訪問vector的元素時,出現了記憶體錯誤。這也就是所謂的迭代器失效。

不止是插入,刪除也會導致迭代器失效。

如上圖,用乙個迭代器指向乙個vector,在刪除乙個資料之後,使用該迭代器訪問vector中的元素時,發生了錯誤。

那麼問題來了,我們知道圖中it 迭代器,指向的是該vector的位址,也就是第乙個元素的位址,而我們刪除的是最後乙個元素,第乙個元素並沒有被刪除,為什麼還會出現訪問出錯。

原因是:比如乙個vector中按順序插入了1 2 3 三個元素,刪除乙個元素只是將size–,而第三個元素所對應的位置儲存的依然是3,當以用下標訪問該vector時,是以size作為訪問終止條件時,因此3不會被訪問到,也就與3被刪除了是相同的道理。但是用迭代器訪問時就不同了,它是以位址訪問與下標無關。難免就會訪問到3,就會出現訪問越界,這是乙個很難發現的問題,因此為了避免這個問題,當我們刪除乙個元素之後,再使用迭代器訪問該vector時就會報錯,幫我們解決了這個問題。

當然並非是對vector而言,對其他的容器來說,只要使用了刪除或者插入介面時,迭代器都會失效。

這是我對迭代器失效的理解,有解釋不到位的地方,還希望大佬們提出來。

vector迭代器失效

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

vector迭代器失效的處理

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

vector中的迭代器失效

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