Sobes.tech
Junior — Middle

Como é feita a comparação de objetos usados como chaves em std::unordered_map?

sobes.tech IA

Resposta da IA

Nos objetos std::unordered_map, as chaves são comparadas usando a função de igualdade (Equality), que por padrão é std::equal_to<Key>.

Ao inserir ou procurar uma chave, o processo é:

  1. Cálculo do código hash da chave usando a função hash (por padrão std::hash<Key>).
  2. Pesquisa na cesta (bucket) correspondente usando comparação de chaves com o operador == ou um predicado de igualdade definido.

Se as chaves forem tipos personalizados, é necessário:

  • Definir uma especialização de std::hash para esse tipo ou fornecer uma função hash própria.
  • Definir o operador == ou fornecer uma função de comparação de igualdade própria.

Exemplo:

struct Key {
    int id;
    bool operator==(const Key& other) const {
        return id == other.id;
    }
};

namespace std {
    template<>
    struct hash<Key> {
        size_t operator()(const Key& k) const {
            return std::hash<int>()(k.id);
        }
    };
}

std::unordered_map<Key, std::string> map;