从std :: set C ++中删除对重复项

时间:2011-03-09 23:33:43

标签: c++ stl

你好我有一个std :: pair对包含以下元素:

set<pair<string, int> > mapElem;

apples 1
apples 2
at 1
eating 1
eating 2
football 1
going 1
today 1
today 2
today 3
today 4
today 5
tommy 1
tommy 2

我需要找到一种方法来删除重复项并保留仅具有最高第二对的方法。 (对不起,如果这个或标题令人困惑) 编辑:如果可能,不使用std :: map!

apples 2
at 1
eating 2
football 1
going 1
today 5
tommy 2

3 个答案:

答案 0 :(得分:5)

map<string, int> aMap(mapElem.begin(), mapElem.end());
set<pair<string, int> > Temp(aMap.begin(), aMap.end());
mapElem.swap(Temp);

没有地图:

set<pair<string, int> >::iterator nextit = mapElem.begin();
while (nextit != mapElem.end()) {
  set<pair<string, int> >::iterator it = nextit++;
  if (nextit != mapElem.end()) {
    if (it->first == nextit->first) {
      mapElem.erase(it);
    }
  }
}

答案 1 :(得分:1)

std::set似乎是原始数据的一个相当奇怪的容器。

无论如何,只需遍历集合,并使用std::map来存储具有最高值的对。对于每对,如果地图中的对具有较低的值,请更新它。

一个普通的for循环会做得很好,不要考虑for_each等等(保持简单)。

干杯&amp;第h。,

答案 2 :(得分:1)

请注意,集合的内容首先按字符串排序,然后按整数排序。因此,要为每个字符串值删除除最高值条目以外的所有条目,请找到具有该字符串值的范围,并删除除最后一个之外的所有条目。像这样(未经测试):

for (iterator i = map.begin(); i != map.end(); ) {
    for (iterator j = i; j != map.end(); ) {
        iterator k = j++;
        if (j == map.end() || j->first != i->first) {
            map.erase(i,k);
            i = j;
        }
    }
}