STL程式設計實踐二: 注意迭代子的失效 (轉)

worldblog發表於2007-12-11
STL程式設計實踐二: 注意迭代子的失效 (轉)[@more@]

 

 

STL設計實踐二: 注意迭代子的失效:namespace prefix = o ns = "urn:schemas--com::office" />

迭代子是STL中很重要的特性,但是其很脆弱(我個人認為),因為使用它的條件很苛刻,一不小心就失效了。其在兩中情況下可能會失效。

1.當容器有插入操作時

在初始化了迭代子後,如果容器有插入操作時,迭代子可能失效。

#include

#include

 

using namespace std;

 

void main()

{

vector vecobj(10,5);

vector::iterator iter=vecobj.begin();

vecobj.insert(iter,6);

for(;iter!=vecobj.end();iter++)

{

cout<

}

}

當編譯並該程式時,輸出的結果亂七八糟。這是因為在初化了迭代子後,容器發生了插入操作而引起的。所以容器在發生了插入操作後迭代子需重新初始化。把上面的for語句換成下面的即可輸出正常,當然實際的應用中不可能如此簡單,但一定要小心使用。

for(iter=vecobj.begin();iter!=vecobj.end();iter++)

2.當容器有刪除元素操作時

在初始化了迭代子後,如果容器有刪除元素操作時,迭代子可能失效。

#pragma warning(disable : 4786)

#include

#include

using namespace std;

 

int main (void)

{

vector nvec(10,7);

vector::iterator it=nvec.begin();

for(;it!=nvec.end();it++)

{

if(*it==7) nvec.erase(it);

}

for(it=nvec.begin();it!=nvec.end();it++)

{

cout<

}

return 0;

}

我們的意圖很明顯是想刪除所有容器中值為7的。但結果並沒刪除完(不要告訴我請用clear)。

當我們利用迭代子刪除和插入元素時都有可能使迭代子失效。迭代子的失效可能引起許多的問題,所以我們要注意。一定要小心的使用迭代子,一定要小心。在這個世界生存,什麼都要小心,不是嗎?:)

文章寫的倉促,有錯別字或錯誤請大家多批評指出。謝謝大家的捧場,在下感激不盡,歡迎和大家交流 (-袁凱-)。

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991357/,如需轉載,請註明出處,否則將追究法律責任。

相關文章