Afin d'utiliser des types définis par l'utilisateur comme clés dans des conteneurs non ordonnés tels que std::unordered_set et std:: unordered_map, il faut implémenter l'opérateur d'égalité (operator==) et un foncteur de hachage. Une approche plus pratique consisterait à créer une fonction de hachage par défaut spécifiquement pour le type personnalisé, analogue aux fonctions de hachage intégrées fournies pour les types standard.
En examinant diverses ressources, il semble que la spécialisation std::hash< ;X>::operator() pour un type X défini par l'utilisateur est en effet réalisable. Cependant, les questions suivantes se posent :
La norme C autorise et encourage explicitement l'ajout de spécialisations à l'espace de noms std, à condition que l'un des types impliqués soit défini par l'utilisateur. Par conséquent, on peut répondre par l'affirmative à la première question.
La méthode correcte et préférée pour spécialiser la fonction de hachage en C 11 consiste à définir une structure dans l'espace de noms std comme suit :
namespace std { template <> struct hash<Foo> { size_t operator()(const Foo & x) const { // Implementation of the hash function for type Foo } }; }
Cette syntaxe garantit la conformité à la norme C 11 et permet de spécifier des fonctions de hachage personnalisées pour des valeurs définies par l'utilisateur. types.
Malheureusement, il n'existe pas de méthode indépendante de la plate-forme pour spécialiser std::hash
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!