什麼是迭代器失效?
我理解的迭代器失效,是指迭代器不能正確指示我們想要操作的物件了,對迭代器進行的操作會產生錯誤的結果。我們舉個栗子來看看迭代器失效是怎麼回事~
// 先定義乙個用來輸出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...