Sulla base di un'idea di @ swegi, ho implementato una soluzione in c++11 utilizzando un 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.
Code on Ideone
anche io implementato una soluzione C++ 11 basata sull'idea di @Chris utilizzando un vettore di coppie. Per il corretto smistamento, ho fornire un lambda expression come confronto functor:
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;
Code on Ideone
La prima soluzione è più compatta, ma entrambe le soluzioni devono avere all'incirca le stesse prestazioni.L'inserimento in un multimap
è di O (log n), ma questo deve essere fatto per n voci, con conseguente O (n log n). L'ordinamento del vettore nella seconda soluzione comporta inoltre O (n log n).
Ho anche provato l'idea di @Chris sull'utilizzo di un set di coppie. Tuttavia, non funzionerà se i valori non sono tutti distinti. L'uso di un functor che confronta solo il secondo elemento della coppia non aiuta. Se prima inserisci make_pair(1, 1)
nel set e poi provi a inserire make_pair(2, 1)
, la seconda coppia non verrà inserita, poiché entrambe le coppie sono identiche a quella serie. Puoi vedere quell'effetto here on Ideone.
Vedere 'boost :: bimap' –