Sobes.tech
Junior — Middle

Quais predicados especiais devem ser definidos para usar tipos de usuário em std::unordered_map?

sobes.tech IA

Resposta da IA

Para usar tipos personalizados em std::unordered_map, é necessário definir duas coisas:

  1. Função de hash — um objeto ou função que aceita a chave e retorna o seu hash (um valor inteiro). Geralmente, isso é feito através da especialização do template std::hash para o seu tipo ou passando um hash personalizado como parâmetro de template.

  2. Operador de comparação de igualdade — deve estar definido o operador operator== para o seu tipo, para que o unordered_map possa comparar as chaves e determinar se são iguais.

Exemplo:

#include <unordered_map>
#include <string>

struct Key {
    int id;
    std::string name;

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

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

int main() {
    std::unordered_map<Key, int> map;
    map[{1, "test"}] = 42;
}

Sem essas definições, o std::unordered_map não poderá armazenar nem procurar elementos corretamente por chaves de tipos personalizados.