Удалить пару дубликатов из std :: set C ++ - PullRequest
1 голос
/ 10 марта 2011

Здравствуйте, у меня есть пара std :: set, которая содержит следующие элементы:

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

Мне нужно найти способ удалить дубликаты и оставить только те, у которых самая высокая вторая пара.(Извините, если это или заголовок сбивает с толку) edit: если возможно без использования std :: map!

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

Ответы [ 3 ]

5 голосов
/ 10 марта 2011
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 голос
/ 10 марта 2011

Обратите внимание, что содержимое набора отсортировано сначала по строке, а затем по целому числу. Таким образом, чтобы удалить все записи, кроме значений с самым высоким значением для каждого строкового значения, найдите диапазон с этим строковым значением и удалите все, кроме последнего. Примерно так (не проверено):

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;
        }
    }
}
1 голос
/ 10 марта 2011

A std::set кажется довольно странным контейнером для ваших исходных данных.

В любом случае, просто выполните итерации по набору и используйте std::map для хранения пар с наибольшим значением.Для каждой пары, если пара на карте имеет более низкое значение, обновите его.

Обычный цикл for будет работать хорошо, не думайте о for_each и прочем (пусть это будет просто).

Приветствия & hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...