c++ map, mutimap删除问题

2012-12-06 13:51:05 · 作者: · 浏览: 346

    这样删除会导致程序内存覆盖等一系列不可预知的bug

    map<string, string>::iterator iter;

    for ( iter = mm.begin();iter != mm.end(); iter ++ )

    {

    if ( iter->second == something )

    {

    mm.erase( iter );

    }

    }

    原因:当erase掉iter后,继续执行iter++,这个时候就乱套了

    正确方法:

    for (iter = mm.begin();iter != mm.end();)

    {

    if ( iter->second == something )

    {

    mm.erase( iter++ );

    }

    else

    {

    iter++;   // Use Pre Increment for efficiency.

    }

    }

    可能有人不理解mm.erase(iter++)

    其实和这个是一样的

    for (iter = mm.begin();iter != mm.end();)

    {

    if ( iter->second == something )

    {

    map<string, string>::iterator iter_erase;

    iter_erase = iter++ //先保存后++再删除

    mm.erase( iter_erase );

    }

    else

    {

    iter++;   // Use Pre Increment for efficiency.

    }

    }