在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
...
答案 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;
}