STL中的容器按存儲(chǔ)方式分為兩類:一類是按以數(shù)組形式存儲(chǔ)的容器(如:vector,deque);另一類是以不連續(xù)的節(jié)點(diǎn)形式存儲(chǔ)的容器(如:list,map,set)。 在使用erase方法刪除元素時(shí),迭代器有時(shí)候會(huì)失效。在Effective STL,條款9,找到了erase容器中元素的原則。
1. 對(duì)于關(guān)聯(lián)容器(如map, set, multimap,multiset),刪除當(dāng)前的iterator,僅僅會(huì)使當(dāng)前的iterator失效,只要在erase時(shí),遞增當(dāng)前iterator即可。這是因?yàn)閙ap之類的容器,使用了紅黑樹(shù)來(lái)實(shí)現(xiàn),插入、刪除一個(gè)結(jié)點(diǎn)不會(huì)對(duì)其他結(jié)點(diǎn)造成影響。
錯(cuò)誤的使用方法:
std::map<string, string> mapTest;
std::map<string, string>::iterator iter;
for ( iter = mapTest.begin();iter != mapTest.end(); iter ++ )
{
if ( iter->second == "test" )
{
mapTest.erase( iter );
}
}
正確的使用方法1:
std::map<string, string> mapTest;
std::map<string, string>::iterator iter;
for ( iter = mapTest.begin();iter != mapTest.end();)
{
if ( iter->second == "test" )
{
mapTest.erase( iter++ );
}
else
{
iter++; // Use Pre Increment for efficiency.
}
}
因?yàn)閕ter傳給erase方法的是一個(gè)副本,iter++會(huì)指向下一個(gè)元素。 正確的使用方法2:
std::map<string, string> mapTest;
std::map<string, string>::iterator iter;
for ( iter = mapTest.begin();iter != mapTest.end();)
{
if ( iter->second == "test" )
{
iter = mapTest.erase( iter );
}
else
{
++iter; // Use Pre Increment for efficiency.
}
}
2. 對(duì)于序列式容器(如vector,deque),刪除當(dāng)前的iterator會(huì)使后面所有元素的iterator都失效。這是因?yàn)関etor,deque使用了連續(xù)分配的內(nèi)存,刪除一個(gè)元素導(dǎo)致后面所有的元素會(huì)向前移動(dòng)一個(gè)位置。還好erase方法可以返回下一個(gè)有效的iterator。 3. 對(duì)于list來(lái)說(shuō),它使用了不連續(xù)分配的內(nèi)存,并且它的erase方法也會(huì)返回下一個(gè)有效的iterator,因此上面兩種正確的方法都可以使用。 其他鏈接:
http://www.shnenglu.com/Herbert/archive/2009/01/08/70479.html
其他鏈接:
http://blog.csdn.net/kay226/article/details/6126515
其他鏈接:
http://www.shnenglu.com/humanchao/archive/2013/04/22/199630.html
posted on 2013-10-14 18:22
王海光 閱讀(1004)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
STL