删除STL Map中与value匹配的所有条目

时间:2015-01-11 17:06:06

标签: c++ dictionary stl

我正在尝试删除地图中的所有条目,其中值== 50表示任何键。

这段代码对我来说很好。

 while (itr != mymap.end())
 {
    if ((*itr).second == 50)
        mymap.erase(itr++);
     else
        itr++;

 }

但是这段代码给出了运行时错误。

while (itr != mymap.end())
{
    if ((*itr).second == 50)
    {    
        mymap.erase(itr);
        itr++
    }
    else
        itr++;

}

我怀疑是不是两个逻辑都一样?为什么在第二种情况下运行时错误?

1 个答案:

答案 0 :(得分:2)

不,逻辑不一样。 在第一种情况下,当迭代器是有效的迭代器时,迭代器会在删除元素之前进行后增量。 在第二种情况下,当元素是无效迭代器时,迭代器会在删除元素后进行后增量。

此操作的常用方法如下

while ( itr != mymap.end() )
{
    if ( (*itr).second == 50 )
        itr = mymap.erase( itr );
     else
        itr++;
}

根据C ++标准(23.2.4关联容器)

  

9插入和安置成员不得影响其有效性   迭代器和对容器的引用,以及擦除成员   将仅使迭代器和对已擦除的引用无效   元素