C++反復器削除の注意

1189 ワード

iterator erase( iterator pos ); C++STLでの反復器の削除は慎重に行う必要があります.1、vector vectorは遍歴中にerase(pos)を行い、このときiter++のときにバグが発生し、フィールドや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++のときにバグが発生し、直接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++のときにバグが発生し、未知の問題が発生します.ソリューション:
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