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删除
}
}