Spécialisation std::hash pour les types définis par l'utilisateur dans des conteneurs non ordonnés
Pour activer l'utilisation de types de clés personnalisés dans std::unordered_set et std::unordered_map, il faut fournir à la fois un opérateur d'égalité et une fonction de hachage. Cela implique généralement de définir une structure ou une classe personnalisée qui implémente ces opérateurs. Cependant, il serait plus pratique d'utiliser une fonction de hachage par défaut pour les types définis par l'utilisateur, similaire aux types intégrés fournis par le compilateur et la bibliothèque.
Selon le projet de norme C N3242 et Boost.Unordered , il est possible de spécialiser std::hash pour un type personnalisé. Cela implique d'ajouter une spécialisation à l'espace de noms std :
namespace std { template <> inline size_t hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } }
Dans cet exemple, la fonction de hachage pour le type X est spécialisée pour utiliser la fonction de hachage pour le type int, qui suppose que X a un identifiant de variable membre. Il est important de noter que la fonction de hachage doit être spécialisée pour le type d'argument de modèle spécifique et que la valeur de hachage résultante doit être cohérente avec l'opérateur d'égalité pour le type.
Légalité et portabilité :
namespace std { template <> struct hash<X> { size_t operator()(const X& x) const { return hash<int>()(x.id); } }; }
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!