c++ 如何从多Map中移除特定项目?

xj3cbfub  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(153)
#include <map>
#include <iostream>
 
int main()
{
    std::multimap <int, int> map;
 
    // insert the values in multimap
    map.insert(std::make_pair(1, 10));
    map.insert(std::make_pair(2, 20));
    map.insert(std::make_pair(2, 30));
    map.insert(std::make_pair(2, 40));
    map.insert(std::make_pair(3, 50));
    map.insert(std::make_pair(4, 60));
    map.insert(std::make_pair(4, 70));
     
    int key = 2;   
    bool fo = false;
    for (auto itr = map.begin(); itr != map.end(); itr++)   
    {
      if (itr -> first == key)       
      {  
        if(fo)
        {
          map.erase(itr);
        }
        fo = true;
      }
    }

     for (auto itr = map.begin(); itr != map.end(); itr++)   
     {
                std::cout << itr -> first << "  "
                 << itr -> second << std::endl;
     }

    return 0;
}

map.erase(itr);使最后一个for循环输出为空。其思想是最后一个for循环将输出不带2的map,但由于bool fo的原因,前2除外。如何修复此问题以获得上述所需的输出?

dced5bon

dced5bon1#

map.erase(itr);

itr迭代器现在是无效的。当你从容器中erase()一些东西时,擦除值的迭代器总是无效的,并且根据容器的不同,其他迭代器可能无效也可能不无效。但是这里的问题是这个特定的itr。它现在是一个燃烧的残骸。

...; itr++)

...... aaa,然后立即递增无效的迭代器。
如果查看erase()文档,您会发现erase()返回容器中***next***值的迭代器,itr++也会返回该迭代器。

if ( ... your condition goes here ... )
{
    itr=map.erase(itr);
}
else
{
    itr++;
}

迭代器的增量从for循环本身中移除,并在这里完成,作为对erase()的警告。

pb3skfrl

pb3skfrl2#

你不需要在整个map中循环来查找具有给定键的元素,通过键快速查找元素是map的关键所在,你可能需要这样的代码:

auto [beg, end] = map.equal_range(key);
if (beg != end) {
  map.erase(++beg, end);
}

这将擦除除除具有给定键的第一个元素以外的所有元素。

相关问题