Например, если у меня есть такой mmap:
alice -> 30
bob -> 23
josh -> 20
josh -> 30
andy -> 40
andy -> 40
чтобы получить только эти пары:
alice -> 30
bob -> 23
josh -> 20
andy -> 40
Например, если у меня есть такой mmap:
alice -> 30
bob -> 23
josh -> 20
josh -> 30
andy -> 40
andy -> 40
чтобы получить только эти пары:
alice -> 30
bob -> 23
josh -> 20
andy -> 40
Это должно сделать это как можно более чистым и эффективным:
for(auto it = m.begin(); it != m.end(); it = m.upper_bound(it->first)) {
std::cout << it->first << ":" << it->second << std::endl;
}
Вот краткий ответ, но не самый эффективный
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;
}
Это работает, потому что мы начинаем с конца. Таким образом, любые повторяющиеся ключи в мультикарте перезапишут предыдущий ключ в карте. Так как мы начинаем с конца, у нас должен быть первый ключ
Может быть, вам это нужно, я использовал 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