vector迭代器失效學習總結

2021-09-08 15:53:48 字數 1818 閱讀 9983

什麼是迭代器失效?

我理解的迭代器失效,是指迭代器不能正確指示我們想要操作的物件了,對迭代器進行的操作會產生錯誤的結果。我們舉個栗子來看看迭代器失效是怎麼回事~

// 先定義乙個用來輸出vector物件的函式show_vec

void

show_vec

(vector

::iterator first, vector

::iterator last)

std:

:cout <<

" "<< std:

:endl;

}

我們來看乙個會使迭代器失效的栗子~

int main()

show_vec

(vecstring.

begin()

, vecstring.

end())

;return0;

}

看一下它的輸入和對應的輸出結果。注意到我輸入了兩次「lihonghe」,然而它只刪除了一次,問題來了這個栗子是怎麼失效的呢?

元素lihonghe

lihonghe

lilu

lijiaxin

liming

lidongbiao下標0

1234

5我們用「iter」和「↓」來表示當前迭代器。

iter↓

元素lihonghe

lihonghe

lilu

lijiaxin

liming

lidongbiao下標0

1234

5進入迴圈,我們發現第乙個元素是「lihonghe」,需要使用erase成員函式刪除它(見erase的執行條件)。erase成員函式如何刪除元素,對於我們分析iter的變化至關重要,因此我們要插播一下erase的實現方法(僅分析刪除單個元素的情況)。

iterator erase

(iterator position)

看完**我們可以知道,erase在刪除元素的時候,是把該元素後邊的所有元素向前移動一位,而返回的迭代器還是原來的迭代器。所以在刪除「lihonghe」之後,迭代器「iter」還在下標「0」的位置。

iter↓

元素lihonghe

lilu

lijiaxin

liming

lidongbiao

(destroy)下標0

1234

5回到迴圈,當我們刪除完「lihonghe」之後系統會執行「iter++」操作,這使「iter」移到「lilu」,也就錯過了第二個「lihonghe」。因此我們在進入迴圈中,不滿足if (*i == 「lihonghe」)的執行條件,這就使得輸出中還有乙個「lihonghe」存在。迭代器也就失效了。

iter↓

元素lihonghe

lilu

lijiaxin

liming

lidongbiao

(destroy)下標0

1234

5更改它的方法,就是把對迭代器的操作,同迴圈體分開。區域性**更改如下:

for

(i=vecstring.

begin()

; i!=vecstring.

end();

)// 將i++與erase分開執行,這個迴圈就沒問題了

vector迭代器失效

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

vector的迭代器失效

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

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