Sobes.tech
Junior

Quelle est la différence entre les conteneurs map et unordered_map en C++?

sobes.tech IA

Réponse de l'IA

La principale différence réside dans la façon dont les éléments sont stockés et récupérés :

  • std::map : Stocke les éléments dans un ordre trié par clé. Il est généralement implémenté à l'aide d'un arbre rouge-noir. La recherche, l'insertion et la suppression ont une complexité logarithmique O(log N), où N est le nombre d'éléments.
  • std::unordered_map : Stocke les éléments dans une table de hachage. L'ordre des éléments est arbitraire. En moyenne, la recherche, l'insertion et la suppression ont une complexité constante O(1). En cas de collisions, la complexité peut atteindre O(N).
Caractéristique std::map std::unordered_map
Ordre Par clé (croissant) Non
Structure de base Arbre rouge-noir Table de hachage
Complexité moyenne O(log N) O(1)
Cas pire O(log N) O(N)
Exigences de clé Opérateur < Fonction de hachage et ==

Exemple d'utilisation :

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

int main() {
    // std::map : éléments triés par clé
    std::map<std::string, int> sorted_map;
    sorted_map["banana"] = 3;
    sorted_map["apple"] = 1;
    sorted_map["cherry"] = 2;

    // Affichage : apple 1, banana 3, cherry 2 (l'ordre est important)
    for (const auto& pair : sorted_map) {
        std::cout << pair.first << " " << pair.second << std::endl;
    }

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

    // std::unordered_map : ordre des éléments non garanti
    std::unordered_map<std::string, int> unordered_map;
    unordered_map["banana"] = 3;
    unordered_map["apple"] = 1;
    unordered_map["cherry"] = 2;

    // La sortie peut varier (par exemple, cherry 2, apple 1, banana 3)
    for (const auto& pair : unordered_map) {
        std::cout << pair.first << " " << pair.second << std::endl;
    }

    return 0;
}