Spécialisation std::hash pour les types personnalisés dans des conteneurs non ordonnés
Dans des conteneurs non ordonnés comme std::unordered_set et std::unordered_map, prenant en charge Les types de clés personnalisés nécessitent de fournir à la fois Operator== et un foncteur de hachage. Bien qu'il soit pratique d'utiliser un foncteur de hachage personnalisé, il est également souhaitable d'avoir un hachage par défaut pour les types personnalisés similaires aux types intégrés.
Pour y parvenir, on peut spécialiser std::hash
Légalité
La spécification d'une spécialisation dans l'espace de noms std est autorisée et, en fait, encouragée dans les cas comme ça.
Conformité
La bonne façon de se spécialiser std::hash consiste à définir une structure personnalisée dans l'espace de noms std. L'extrait de code suivant montre la syntaxe correcte :
namespace std { template <> struct hash<Foo> { size_t operator()(const Foo &x) const { // Hashing logic for custom type } }; }
Portabilité
Cette méthode de spécialisation std::hash est portable sur les principaux compilateurs tels que g et MSVC.
Fonctionnalités supplémentaires
En dehors de std::hash, on peut également spécialiser d'autres foncteurs comme std::less, std::equal_to et std::swap pour des types personnalisés afin d'améliorer les fonctionnalités.
Conclusion
En spécialisant std::hash, on peut fournir une fonction de hachage par défaut pour les types personnalisés dans des conteneurs non ordonnés, ce qui rend plus pratique leur utilisation dans la bibliothèque standard conteneurs. Cette approche est à la fois légale et transférable tout en adhérant aux normes C 11.
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!