Si tengo un stl map de cadena a int y quiero imprimir todos los valores int ordenados, ¿cómo puedo hacer eso?¿Cómo puedo ordenar un mapa por su .segundo parámetro
Respuesta
No se puede ordenar un mapa por sus valores debido a la implementación del mapa.
Si desea emitir los elementos en el mapa en un orden tal ordenada entonces usted tiene que verter primero el contenido del mapa en un vector (por ejemplo) y ordenar ese vector:
template <typename T1, typename T2>
struct less_second {
typedef pair<T1, T2> type;
bool operator()(type const& a, type const& b) const {
return a.second < b.second;
}
};
map<string, int> mymap;
// …
vector<pair<string, int> > mapcopy(mymap.begin(), mymap.end());
sort(mapcopy.begin(), mapcopy.end(), less_second<string, int>());
O, alternativamente, simplemente copie los valores del mapa, deje las claves y clasifique el vector resultante directamente.
Cuando pones ambos 'first' _and_' second' en el vector de todos modos, ¿por qué no ponerlo en un 'std :: map
@sbi: bueno, obviamente porque sería * waaay * demasiado simple y obvio. :-P –
@sbi, los valores pueden repetirse. –
No se puede ordenar un mapa, es un contenedor asociativo, no es secuencial, y los contenedores asociados se ordenan por orden interno.
Si solo desea imprimir los valores int
, puede ponerlos en un std::vector
, ordenar el vector e imprimir los valores.
Creo que quiere imprimir todas las cadenas ordenadas por sus enteros :) –
'std :: map's no están ordenados por 'algunos' ... Se ordenan por valores clave dados explícitamente, en este caso cadenas. –
@malleor: Sí, lo sé. Y un 'std :: unordered_map' está ordenado por otro orden. Escribí sobre "contenedores asociados", no sobre "std :: map" en esa frase. – sbi
No puede hacer esto automáticamente. std::map
usa el primer valor (nomen omen 'clave') para ordenar el contenido.
En su lugar, puede usar boost::multi_index_container
.
Si necesita hacer esto varias veces, puede ser más eficiente tener dos contenedores separados, p. su mapa y un contenedor clasificado como set
o multiset
para almacenar las entradas ordenadas, en lugar de tener que crear un contenedor y ordenarlo sobre la marcha. Pero luego debes mantenerlos sincronizados, lo que podría ser desagradable. Podría encapsular eso envolviéndolos en una clase, o mejor aún usar un boost::multi_index_container
.
En lugar de utilizar un vector
, prefiero simplemente copiándolos en un set<int>
:
#include <map>
#include <set>
#include <string>
#include <iostream>
#include <iterator>
using namespace std;
set<int> map2set(map<string, int> const& m) {
set<int> r;
for (map<string, int>::const_iterator b = m.begin(), e = m.end(); b != e; ++b)
r.insert(b->second);
return r;
}
int main() {
map<string, int> m;
m.insert(make_pair("hello", 42));
m.insert(make_pair("world", 24));
set<int> s = map2set(m);
copy(s.begin(), s.end(), ostream_iterator<int>(cout, "\n"));
}
Puede copiar todos los valores en el vector y ordenarla.
#include <algorithm>
#include <map>
#include <vector>
int get_second(pair<string, int> i){ return i.second; }
int main(int argc, char* argv){
map<string, int> m;
m["tt"] = 2;
m["rr"] = 1;
m["ee"] = 3;
vector<int> v(m.size());
transform(m.begin(), m.end(), v.begin(), get_second);
sort(v.begin(), v.end());
for (int i=0; i<v.size(); i++) cout << v[i] << endl;
}
- 1. ¿Cómo puedo ordenar un mapa STL por valor?
- 2. Scala: ¿cómo puedo ordenar una matriz de tuplas por su segundo elemento?
- 3. Cómo ordenar un objeto std :: vector por su valor flotante
- 4. Ordenar una matriz bidimensional por segundo valor
- 5. Java: ¿cómo puedo ordenar múltiples ArrayList por su tamaño?
- 6. ¿Puedo ordenar texto por su valor numérico en Python?
- 7. ¿Cómo puedo ordenar las claves de un mapa en Java?
- 8. ¿Cómo puedo ordenar un XDocument por atributo?
- 9. Solr/Lucene ¿es posible ordenar primero por relevancia y luego por un segundo atributo?
- 10. ¿Cómo puedo ordenar un NSDictionary?
- 11. nuevo segundo parámetro, C++
- 12. ¿Necesito generar un segundo archivo para ordenar un archivo?
- 13. jQuery Datepicker BeforeShowDay Segundo parámetro
- 14. ¿Cómo ordenar autores por su cuenta de libro con ActiveRecord?
- 15. Ordenar una lista de tuplas por segundo artículo (valor entero)
- 16. PowerShell: ¿cómo puedo ordenar un archivo de texto por columna?
- 17. En Perl, ¿cómo puedo ordenar por frecuencia de un valor?
- 18. Ordenar mapa <String, Object> por claves con IgnoreCase?
- 19. ¿cómo puedo vaciar un mapa mutable (definido por val)?
- 20. ¿Cómo puedo poner un proceso en segundo plano después de su ejecución con CTRL + Z roto?
- 21. ¿El mapa sin ordenar es realmente desordenado?
- 22. Delphi: ¿cómo recorto un mapa de bits "en su lugar"?
- 23. ¿Cómo puedo ordenar un ArrayList lexicográficamente?
- 24. ¿Cómo puedo ordenar por varias condiciones con diferentes pedidos?
- 25. Cómo ordenar los LI según su ID
- 26. ¿Por qué str no puede obtener un segundo parámetro cuando __str__ puede?
- 27. ¿Cómo puedo ordenar un NSMutableArray alfabéticamente?
- 28. ¿Cómo puedo ordenar números lexicográficamente?
- 29. Cálculo del final de un mes o su último segundo
- 30. orden por un parámetro
@Danh El consenso actual es cerrar por la "calidad": Ya que la "calidad" no se puede medir, simplemente voy por votos ascendentes. ;-) Probablemente se deba a qué pregunta golpear las mejores nuevas palabras clave de Google en el título. –
@Danh: En el caso general, eso es cierto: para un 'map', no es necesariamente cierto que existan comparaciones para 'value_type' . Para el caso específico de 'map ', la comparación por valor es posible. –