首页 > 解决方案 > 在c ++ stl map中,删除具有重复值的条目

问题描述

考虑 map mymap 有条目

<'a', 111>  
<'b', 567>  
<'c', 956>  
<'d', 222>  
<'e', 111>  
<'f', 222>  
<'h', 222>  
<'i', 492> 

等等...
如何删除地图中重复值的条目。
例如,键 'a' 和 'e' 存在值 111。因此,保留“a”的映射条目并删除“e”的条目
对于值 222,保留条目“d”并删除条目“f”和“h”。
我正在寻找具有最佳空间和时间复杂度的解决方案

标签: c++dictionarystl

解决方案


你可能想要这样的东西:

#include <iostream>
#include <map>
#include <set>

int main() {
  std::map<char, int> mymap
  {
    {'a', 111}, {'b', 567}, {'c', 956}, {'d', 222}, 
    {'e', 111}, {'f', 222}, {'h', 222}, {'i', 492},
  };

  std::set<int> existingvalues;

  for (auto it = mymap.begin(); it != mymap.end(); it++)
  {
    if (existingvalues.find(it->second) != existingvalues.end())
      mymap.erase(it--);                  // value already encountered => remove entry
    else
      existingvalues.insert(it->second);  // value not yet encountered => remeber it
  }

  for (auto it = mymap.begin(); it != mymap.end(); it++)
    std::cout << "<'" << it->first << "', " << it->second << ">\n";
}

推荐阅读