C++迭代器删除的注意事项

iterator erase( iterator pos );
对C++ STL中迭代器的删除需要慎重,如上方法。
1、vector
vector在遍历中进行 erase(pos) ,这个时候iter++的时候会出现bug,会跳过一个字段或者coredump。
解决方法:(要删除的时候直接赋值返回值,但是不能++)

vector::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::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::iterator iter;
for(iter = testMap.begin(); iter != testMap.end(); iter++)
{
    printf("%d " , iter->second );
    if( iter->second == 3 )
    {
        testMap.erase( iter->first ); //注意这里,是通过key删除
    }
}

转自于 http://blog.csdn.net/ghosc/article/details/7008521

你可能感兴趣的:(C++)