在多重映射中删除重复项的有效方法? 在C++中,在大型MultMAP中删除重复的最好方法是什么?例如,我有一个多重映射,其值为9的键出现两次,如何快速摆脱它?谢谢 ... <1,2> --> 3 <1,3> --> 7 <1,4> --> 9 <1,4> --> 9 ... 。。。 --> 3 --> 7 --> 9 --> 9 ...

在多重映射中删除重复项的有效方法? 在C++中,在大型MultMAP中删除重复的最好方法是什么?例如,我有一个多重映射,其值为9的键出现两次,如何快速摆脱它?谢谢 ... <1,2> --> 3 <1,3> --> 7 <1,4> --> 9 <1,4> --> 9 ... 。。。 --> 3 --> 7 --> 9 --> 9 ...,c++,stl,C++,Stl,我希望是这样 ... <1,2> --> 3 <1,3> --> 7 <1,4> --> 9 ... 。。。 --> 3 --> 7 --> 9 ... 一种需要O(n)时间的方法是将原始地图复制到新地图。比如说, multimap<T,U> original_map; multimap<T,U> new_map; while (original_map.size() > 0) { auto

我希望是这样

...
<1,2> --> 3
<1,3> --> 7
<1,4> --> 9
...
。。。
--> 3
--> 7
--> 9
...

一种需要O(n)时间的方法是将原始地图复制到新地图。比如说,

multimap<T,U> original_map; 
multimap<T,U> new_map; 

while (original_map.size() > 0) 
{ 
    auto element = *(original_map.begin()); 
    new_map.insert(make_pair(element.first,element.second)); 
    original_map.erase(element.first); 
}
multimap-original\u-map;
多地图新地图;
while(原始映射.size()>0)
{ 
自动元素=*(原始映射.begin());
新建映射.insert(生成映射对(element.first,element.second));
原始映射。擦除(元素。第一);
}
注意:这是假设重复条目的标准是只有相同密钥的条目。

这与您的要求类似。这是不需要额外分配的就地解决方案

if (mymap.size() > 1) {
  auto prev_key = mymap.begin()->first;
  auto it = mymap.begin(); 
  for (++it; it != mymap.end();) {
    if (it->first == prev_key) {
      it = mymap.erase(it);
    } else {
      prev_key = it->first;
      ++it;
   }
} 
您可以使用“set”

map-mymap;
mymap[1,2]。插入(3);
mymap[1,3]。插入(7);
mymap[1,4]。插入(9);
mymap[1,4]。插入(9);
//打印结果。
对于(自动itr=mymap.begin();itr!=mymap.end();itr++){

您使用的映射是什么?
std::map
不允许重复。首先要解决的是,您要从多重映射中的重复项中保留哪些内容似乎有点重要。如果您希望为多重映射中的每个不同键插入最后一项,只需复制它。每个相同键的值是否相同?您能更清楚一些吗确切地说,你想删除什么,什么才算是“复制品”在你看来,你希望有多个值,但不想重复,所以为什么不使用map并将值本身保存在setAdvice中呢?解决源代码问题,为什么首先要将此项添加到列表中两次?你要求的是一种解决方法,这比代码中出现错误更糟糕。因为它会隐藏一个你以后无法解决的深层次问题只是一个注意/警告:这会删除键匹配的条目,而不管它们的值是否匹配。从问题中不清楚这是想要的,还是应该删除键和值的重复项。我同意Tony Delroy的观点,这个答案不仅删除重复项,而且删除所有重复项l键重复。在这种情况下最好使用地图。
map<Point, set<int>> mymap;
mymap[1,2].insert(3);
mymap[1,3].insert(7);
mymap[1,4].insert(9);
mymap[1,4].insert(9);
//Print result.
for(auto itr = mymap.begin(); itr!=mymap.end(); itr++) {
  cout<<itr->first.x<<" "<< itr->first.y<<" ";
  for(set<int>::iterator vitr = itr->second.begin(); vitr != itr->second.end(); vitr++){
      cout<<(*vitr) +1<<" ";
  }
cout<<endl;
}