STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在STL中用earse()方法删除一个元素很简单,基本上也不会出什么错,但是在遍历删除某条件下的元素时就有可能会弄错了。在list、set、map、vector和deque遍历删除某条件元素时通用的一种方法可以这样使用:
std::list< int> List; // 这里也可以是set、map、vector和deque
std::list< int>::iterator iter = List.begin();
while( iter != List.end() )
{
if( /* 是否删除的条件判断 */ )
{
iter = List.erase( iter );
}
else
iter ++;
}
通过erase方法的返回值来获取下一个元素的位置。
对于list、map等节点形式的容器有人会用另一种方式:
while( iter != List.end() )
{
if( /* 是否删除的条件判断 */ )
{
List.erase( iter++ );
}
else
iter ++;
}
而有些人往往会误用为:
while( iter != List.end() )
{
if( /* 是否删除的条件判断 */ )
{
List.erase( ++iter );
}
else
iter ++;
}
在这里“++”运算符是被重载过的,与我们平常的理解刚好相反,erase( iter++) 是先获取下一个元素的位置再删除; erase( ++iter) 是删除以后再获取下一个元素的位置。
为了不混淆“++”运算符,建议使用前面的通过erase方法的返回值来获取下一个元素的位置的方式来做遍历删除某些元素,这样所有的STL容器还基本上可以共用,记起来也方便呢,呵...