STL中的容器按存儲方式分為兩類:一類是按以數(shù)組形式存儲的容器(如:vector,deque);另一類是以不連續(xù)的節(jié)點形式存儲的容器(如:list,map,set)。 在使用erase方法刪除元素時,迭代器有時候會失效。在Effective STL,條款9,找到了erase容器中元素的原則。
1. 對于關聯(lián)容器(如map, set, multimap,multiset),刪除當前的iterator,僅僅會使當前的iterator失效,只要在erase時,遞增當前iterator即可。這是因為map之類的容器,使用了紅黑樹來實現(xiàn),插入、刪除一個結點不會對其他結點造成影響。
錯誤的使用方法:
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.
}
}
因為iter傳給erase方法的是一個副本,iter++會指向下一個元素。 正確的使用方法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. 對于序列式容器(如vector,deque),刪除當前的iterator會使后面所有元素的iterator都失效。這是因為vetor,deque使用了連續(xù)分配的內(nèi)存,刪除一個元素導致后面所有的元素會向前移動一個位置。還好erase方法可以返回下一個有效的iterator。 3. 對于list來說,它使用了不連續(xù)分配的內(nèi)存,并且它的erase方法也會返回下一個有效的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)
評論(0) 編輯 收藏 引用 所屬分類:
STL