Sobes.tech
Junior

¿En qué consiste la diferencia entre los contenedores map y unordered_map en C++?

sobes.tech AI

Respuesta de la IA

La principal diferencia radica en cómo se almacenan y se recuperan los elementos:

  • std::map: Almacena los elementos en orden de clasificación por clave. Generalmente se implementa con un árbol rojo-negro. La búsqueda, inserción y eliminación tienen una complejidad logarítmica O(log N), donde N es la cantidad de elementos.
  • std::unordered_map: Almacena los elementos en una tabla hash. El orden de los elementos es arbitrario. En promedio, la búsqueda, inserción y eliminación tienen una complejidad constante O(1). En el peor caso, con colisiones, la complejidad puede llegar a O(N).
Característica std::map std::unordered_map
Ordenamiento Por clave (ascendente) No
Estructura base Árbol rojo-negro Tabla hash
Complejidad media O(log N) O(1)
Peor caso O(log N) O(N)
Requisitos de clave Operador < Función hash y ==

Ejemplo de uso:

#include <map>
#include <unordered_map>
#include <string>
#include <iostream>

int main() {
    // std::map: elementos ordenados por clave
    std::map<std::string, int> sorted_map;
    sorted_map["banana"] = 3;
    sorted_map["apple"] = 1;
    sorted_map["cherry"] = 2;

    // Salida: apple 1, banana 3, cherry 2 (el orden importa)
    for (const auto& pair : sorted_map) {
        std::cout << pair.first << " " << pair.second << std::endl;
    }

    std::cout << "---" << std::endl;

    // std::unordered_map: orden de los elementos no garantizado
    std::unordered_map<std::string, int> unordered_map;
    unordered_map["banana"] = 3;
    unordered_map["apple"] = 1;
    unordered_map["cherry"] = 2;

    // La salida puede variar (por ejemplo, cherry 2, apple 1, banana 3)
    for (const auto& pair : unordered_map) {
        std::cout << pair.first << " " << pair.second << std::endl;
    }

    return 0;
}