有效的方法来删除多图中的重复项?

时间:2014-03-05 05:23:52

标签: c++ stl

在C ++中删除大型多图中重复项的最佳方法是什么?例如,我有一个多图,密钥< 1,4>它的值9出现两次,如何迅速摆脱它?感谢

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

我希望它成为

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

3 个答案:

答案 0 :(得分:1)

需要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); 
}

注意:这假设重复条目的条件是只有相同密钥的条目。

答案 1 :(得分:1)

Erasing elements in a multimap while iterating与您提出的内容类似。这是没有额外分配的就地解决方案。

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;
   }
} 

答案 2 :(得分:0)

您可以使用“设置”。

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;
}