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:
-
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::hashpara o seu tipo ou passando um hash personalizado como parâmetro de template. -
Operador de comparação de igualdade — deve estar definido o operador
operator==para o seu tipo, para que ounordered_mappossa 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.