Sobes.tech
Junior

Qual é a diferença entre os contêineres map e unordered_map em C++?

sobes.tech IA

Resposta da IA

A principal diferença reside na forma como os elementos são armazenados e recuperados:

  • std::map: Armazena os elementos em ordem classificada por chave. Geralmente é implementado com uma árvore vermelho-preto. A busca, inserção e remoção têm uma complexidade logarítmica O(log N), onde N é a quantidade de elementos.
  • std::unordered_map: Armazena os elementos numa tabela de dispersão. A ordem dos elementos é arbitrária. Em média, busca, inserção e remoção têm uma complexidade constante O(1). No pior caso, com colisões, a complexidade pode atingir O(N).
Característica std::map std::unordered_map
Ordenação Por chave (ascendente) Não
Estrutura base Árvore vermelho-preto Tabela de dispersão
Complexidade média O(log N) O(1)
Pior caso O(log N) O(N)
Requisitos de chave Operador < Função hash e ==

Exemplo de uso:

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

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

    // Saída: apple 1, banana 3, cherry 2 (a ordem importa)
    for (const auto& pair : sorted_map) {
        std::cout << pair.first << " " << pair.second << std::endl;
    }

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

    // std::unordered_map: ordem dos elementos não garantida
    std::unordered_map<std::string, int> unordered_map;
    unordered_map["banana"] = 3;
    unordered_map["apple"] = 1;
    unordered_map["cherry"] = 2;

    // A saída pode variar (por exemplo, cherry 2, apple 1, banana 3)
    for (const auto& pair : unordered_map) {
        std::cout << pair.first << " " << pair.second << std::endl;
    }

    return 0;
}