Основываясь на идее @ swegi, я реализовал решение в c ++ 11 , используя multimap
:
map<int, int> m = {{1, 10}, {2, 5}, {4, 6}, {6, 1}};
multimap<int, int> mm;
for(auto const &kv : m)
mm.insert(make_pair(kv.second, kv.first)); // Flip the pairs.
for(auto const &kv : mm)
cout << "m[" << kv.second << "] = " << kv.first << endl; // Flip the pairs again.
Код на Ideone
Я также реализовал решение C ++ 11, основанное на идее @Chris, с использованием вектора пар. Для правильной сортировки я предоставляю лямбда-выражение как функтор сравнения:
map<int, int> m = {{1, 10}, {2, 5}, {4, 6}, {6, 1}};
using mypair = pair<int, int>;
vector<mypair> v(begin(m), end(m));
sort(begin(v), end(v), [](const mypair& a, const mypair& b) { return a.second < b.second; });
for(auto const &p : v)
cout << "m[" << p.first << "] = " << p.second << endl;
Код на Ideone
Первое решение более компактно, но оба решения должны иметь примерно одинаковую производительность. Вставка в multimap
имеет значение O (log n) , но это необходимо сделать для n записей, в результате чего O (n log n), Сортировка вектора во втором решении также приводит к O (n log n) .
Я также попробовал идею @Chris об использовании набора пар. Однако, это не будет работать, если значения не все различны. Использование функтора, который сравнивает только второй элемент пары, не помогает. Если вы сначала вставите make_pair(1, 1)
в набор, а затем попытаетесь вставить make_pair(2, 1)
, то вторая пара не будет вставлена, потому что обе пары рассматриваются как идентичные в этом наборе. Вы можете увидеть этот эффект здесь на Ideone .