iterator erase( iterator pos );
对C++ STL中迭代器的删除需要慎重,如上方法。
1、vector
vector在遍历中进行 erase(pos) ,这个时候iter++的时候会出现bug,会跳过一个字段或者coredump。
解决方法:(要删除的时候直接赋值返回值,但是不能++)
vector<int>::iterator iter2;
for(iter2 = vec.begin(); iter2 != vec.end(); )
{
printf("%d " , *iter2 );
//注意这里
if( *iter2 == 3 ){
iter2 = vec.erase( iter2 );
}else{
iter2++;
}
}
2、list
list在遍历中进行 erase(pos) ,这个时候iter++的时候会出现bug,会直接coredump。
解决方案:
list<int>::iterator iter2;
for(iter2 = vec.begin(); iter2 != vec.end(); iter2++)
{
printf("%d " , *iter2 );
if( *iter2 == 3 ){
vec.remove( *iter2 ); //注意这里,调用remove( const TYPE &val );
}
}
3、map
list在遍历中进行 erase(pos) ,这个时候iter++的时候会出现bug,会出现未知问题。
解决方案:
map<int,int>::iterator iter;
for(iter = testMap.begin(); iter != testMap.end(); iter++)
{
printf("%d " , iter->second );
if( iter->second == 3 )
{
testMap.erase( iter->first ); //注意这里,是通过key删除
}
}
本文深入探讨了C++ STL中迭代器在删除元素时可能遇到的问题,特别是针对vector、list和map容器的处理方法。通过具体实例展示了如何避免在迭代过程中出现的bug,包括使用erase()函数的正确方式以及list容器中使用remove()函数的必要性。重点强调了在遍历时直接赋值与删除元素之间的关系,以确保程序的稳定性和高效性。
1159

被折叠的 条评论
为什么被折叠?



