C++反復器削除の注意
1189 ワード
iterator erase( iterator pos ); C++STLでの反復器の削除は慎重に行う必要があります.1、vector vectorは遍歴中にerase(pos)を行い、このときiter++のときにバグが発生し、フィールドやcoredumpがスキップされます.解決方法:(削除するときに直接値を割り当てて値を返しますが、++はできません)
2、list listは遍歴中にerase(pos)を行い、このときiter++のときにバグが発生し、直接coredumpが発生します.ソリューション:
3、map listは遍歴中にerase(pos)を行い、このときiter++のときにバグが発生し、未知の問題が発生します.ソリューション:
から転じるhttp://blog.csdn.net/ghosc/article/details/7008521
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