序列式容器的迭代器應當在使用時才定義

2021-10-13 22:59:20 字數 1746 閱讀 4126

在做總結時發現了自己以前不是很重視的「迭代器失效」的現象

看以下**:(本**不合乎工程規範,僅僅用於學習總結)

#include

#include

using

namespace std;

intmain()

; vector<

int>

::iterator beg = vec.

begin()

; vector<

int>

::iterator end = vec.

end();

vec.

insert

(beg +4,

5); vec.

push_back(7

);//vector的遍歷

for(

; beg != end;

++beg)

cout <<

*beg;

//for (auto each : vec) //範圍for遍歷

// cout << each;

vec.

pop_back()

;return0;

}

**本身沒有任何語法錯誤,表面上看上去也合乎邏輯

但是,因為 insert,push_back導致容器擴容,位址發生改變,迭代器失效

引發異常:

應當在使用時給begend再次賦值,即:

#include

#include

using

namespace std;

intmain()

; vector<

int>

::iterator beg = vec.

begin()

; vector<

int>

::iterator end = vec.

end();

vec.

insert

(beg +4,

5); vec.

push_back(7

);beg = vec.

begin()

; end = vec.

end();

//vector的遍歷

for(

; beg != end;

++beg)

cout <<

*beg;

//for (auto each : vec) //範圍for遍歷

// cout << each;

vec.

pop_back()

;return0;

}

此時,迭代器才有意義,才指向正確的值域。

所以,為了避免迭代器因為擴容等問題導致失效,應當遵循最近宣告定義變數的原則,既可以減少不必要的開銷,也可以避免一些難以發現的問題。

以上**導致的迭代器失效的情況一般不會在實際工程**現(因為這種寫法本身就不規範!!)

但是,如果第一段**是考試題(試問執行結果),將具有極強的欺騙性

感謝閱讀!

C STL 序列式容器與配接器的簡單使用

目錄 c 標準裡提供了以下容器或容器配接器 序列式容器 配接器關聯式容器 不定序關聯容器 array stack setunordered set vector queue mapunordered map list priority queue multiset unordered multise...

容器vector的一些使用與迭代器

上 這裡只是簡單 一下,沒有完整 意會便可。include.intmain 在這裡,我們期望當我們改變emp1時,empvec 0 也會變,即我們希望empvec就是emp1。但由於要呼叫複製建構函式,push back進去的並不是原來的emp1,而是乙個新的employee物件,從而無法實現以上期...

C STL中迭代器與容器的聯合使用(初級版)

在c 中,迭代器與stl其它容器聯合使用時,可以提供一種遍歷的方法,區別於其它形式的遍歷,使用迭代器在書寫思路上較為容易。普通迭代器 這種迭代器支援iter iter 等操作,同樣支援iter 2但是需要注意越界 不建議使用 2等容易越界的操作 vector iterator iter nums.b...