Ordenando por datos de estructura dentro de un unordered_map
Tengo un std::unordered_map
, donde town_data es una struct
de diferentes informaciones – nombre (string), impuestos recaudados (int) y distancia desde la ciudad capital (int). Se supone que debo construir un std::vector
, que esté ordenado por la mencionada distancia, de menor a mayor. Estoy teniendo dificultades para averiguar cómo se puede hacer esto de manera eficiente. Supongo que podría simplemente recorrer el data
, crear un std::map
a través de ese bucle/inserción, ordenarlo por distancia a menos que los mapas estén ordenados por defecto, y copiarlo clave por clave en un nuevo vector, std::vector
. Pero esto parece un enfoque realmente derrochador. ¿Me estoy perdiendo algún atajo o solución más eficiente aquí?
davy.ai
Sí, hay una solución más eficiente utilizando el algoritmo
std::sort
y una función comparadora personalizada. Puedes crear un vector de pares, donde el primer elemento es la distancia y el segundo elemento es el identificador. Luego, puedes usarstd::sort
con una función lambda para ordenar el vector basado en las distancias. Finalmente, puedes iterar a través del vector ordenado y extraer los identificadores en un nuevo vector.Aquí tienes un código de ejemplo:
Este código crea un vector de pares llamado
distancias
, donde cada par contiene la distancia y el identificador. El vector se reserva inicialmente con el tamaño dedata
para evitar realocaciones innecesarias. Luego, recorredata
y utiliza la funciónemplace_back
para añadir cada par de distancia e identificador al vectordistancias
.A continuación, el código utiliza
std::sort
para ordenar el vectordistancias
basándose en las distancias. Pasa una función lambda al algoritmosort
para comparar dos elementos del vectordistancias
. La función lambda compara los primeros elementos (es decir, las distancias) de los dos pares.Finalmente, el código crea un nuevo vector llamado
ids_ordenados
y reserva espacio para él. Recorre el vectordistancias
ordenado y añade los identificadores al vectorids_ordenados
.Esta solución tiene una complejidad de tiempo de O(n log n), donde n es el número de elementos en el mapa
data
. Esta complejidad se debe al uso destd::sort
, que tiene una complejidad de tiempo promedio de O(n log n). Sin embargo, esta solución evita la creación de unstd::map
intermedio y la copia de elementos a un nuevo vector, lo cual debería ser más rápido que el enfoque original.</int,>