как зациклить multimap только для получения первых пар ключ-значение для каждого ключа?

Например, если у меня есть такой mmap:

alice -> 30
bob -> 23
josh -> 20
josh -> 30
andy -> 40
andy -> 40

чтобы получить только эти пары:

alice -> 30
bob -> 23
josh -> 20
andy -> 40

person rsk82    schedule 07.03.2013    source источник
comment
Вероятный дубликат: stackoverflow.com/questions/11554932/   -  person Shafik Yaghmour    schedule 07.03.2013
comment
Вам нужна только одна (в основном случайно выбранная) пара для каждого ключа или действительно первая (по какой метрике)?   -  person Grizzly    schedule 07.03.2013
comment
@Grizzly: ну, что проще, мне не нужна ценность на месте. Я мог бы позже получить значение, которое я хочу.   -  person rsk82    schedule 07.03.2013
comment
@Shafik, для меня это не похоже на дубликат. Этот вопрос хочет найти первое (что бы это ни значило) значение для каждого уникального ключа, а тот, на который вы ссылаетесь, хочет идентифицировать сами уникальные ключи (не заботясь о значениях или о том, какой из них является первым).   -  person JBentley    schedule 07.03.2013
comment
@ rsk82 Так вам действительно нужны все уникальные ключи?   -  person Drew Dormann    schedule 07.03.2013
comment
@DrewDormann: на самом деле да, исходя из того, что это работает (поскольку я не знаю, что задаю этот вопрос), я могу получить любое значение, которое захочу, первое, последнее среднее.   -  person rsk82    schedule 07.03.2013


Ответы (3)


Это должно сделать это как можно более чистым и эффективным:

for(auto it = m.begin(); it != m.end(); it = m.upper_bound(it->first)) {
  std::cout << it->first << ":" << it->second << std::endl;
}
person Viktor Sehr    schedule 07.03.2013
comment
На самом деле это не больше, чем то, что уже есть в ссылке, которую я указал в комментариях stackoverflow.com/questions/11554932/ - person Shafik Yaghmour; 08.03.2013
comment
М М: эм, что ты имеешь в виду? - person Viktor Sehr; 08.03.2013

Вот краткий ответ, но не самый эффективный

multimap<string, int> mm;
// Add stuff to multimap

// Map with only the first items from multimap
map<string,int> m;

for(auto iter = mm.rbegin(); iter != mm.rend(); ++iter){
   m[iter->first] = iter->second;
}

Это работает, потому что мы начинаем с конца. Таким образом, любые повторяющиеся ключи в мультикарте перезапишут предыдущий ключ в карте. Так как мы начинаем с конца, у нас должен быть первый ключ

person John Bandela    schedule 07.03.2013

Может быть, вам это нужно, я использовал lower_bound, чтобы получить только предмет:

#include <iostream>
#include <map>
#include <string>
#include <set>

using namespace std;

int main()
{
    multimap<string, int> m;

    m.insert(make_pair("alice", 30));
    m.insert(make_pair("bob", 23));
    m.insert(make_pair("josh", 30));
    m.insert(make_pair("josh", 20));
    m.insert(make_pair("andy", 40));
    m.insert(make_pair("andy", 40));

    set<string> names;

    for (multimap<string, int>::const_iterator i = m.begin(); i != m.end(); i++)
        names.insert(i->first);

    for (set<string>::const_iterator i = names.begin(); i != names.end(); i++)
    {
        multimap<string, int>::const_iterator j = m.lower_bound(*i);
        cout << j->first << " -> " << j->second << endl;
    }
}

Выход:

Алиса -> 30

Энди -> 40

боб -> 23

Джош -> 30

person masoud    schedule 07.03.2013