Sobre la base de la idea de @ swegi, he implementado una solución en c++11 utilizando 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
también implementó una solución C++ 11 basada en la idea de @Chris usando un vector de pares. Para la clasificación correcta, que proporcionará una lambda expression como funtor comparación:
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 primera solución es más compacto, pero ambas soluciones debería tener más o menos el mismo rendimiento.Inserción en un multimap
es de O (log n), pero esto tiene que ser hecho para n entradas, resultando en O (n log n). La clasificación del vector en la segunda solución también da como resultado O (n log n).
También probé la idea de @Chris de utilizar un conjunto de pares. Sin embargo, no funcionará si los valores no son todos distintos. Usar un functor que compara solo el segundo elemento de la pareja no ayuda. Si inserta primero make_pair(1, 1)
en el conjunto y luego intenta insertar make_pair(2, 1)
, entonces no se insertará el segundo par, ya que ambos pares se consideran idénticos por ese conjunto. Puede ver ese efecto here on Ideone.
Mira 'boost :: bimap' –