在做總結時發現了自己以前不是很重視的「迭代器失效」
的現象
看以下**:(本**不合乎工程規範,僅僅用於學習總結)
**本身沒有任何語法錯誤,表面上看上去也合乎邏輯#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導致容器擴容,位址發生改變,迭代器失效
引發異常:
應當在使用時給beg
,end
再次賦值,即:
此時,迭代器才有意義,才指向正確的值域。#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...