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

Delete all entries in STL Map which matches value

我正在尝试删除映射中任何键的值 == 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++;

}

我的疑问是这两个逻辑不是一样的吗?为什么在第二种情况下 运行 时间错误?

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

此操作的常用方法如下

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

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

9 The insert and emplace members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.