Maison > développement back-end > C++ > Comment puis-je spécialiser `std::hash` pour mes types définis par l'utilisateur en C ?

Comment puis-je spécialiser `std::hash` pour mes types définis par l'utilisateur en C ?

Mary-Kate Olsen
Libérer: 2024-12-10 03:19:16
original
138 Les gens l'ont consulté

How Can I Specialize `std::hash` for My User-Defined Types in C  ?

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); }
}
Copier après la connexion

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é :

  • Est-il légal d'ajouter une spécialisation à std ? Oui, il est légal d'ajouter des spécialisations à std tant que l'un des types impliqués est défini par l'utilisateur.
  • Quelle version de std::hash::operator() est conforme à C 11 ? La bonne façon de spécialiser std::hash en C 11 est de définir une spécialisation de la structure std::hash:
namespace std {
  template <> struct hash<X> {
    size_t operator()(const X& x) const { return hash<int>()(x.id); }
  };
}
Copier après la connexion
  • Existe-t-il un moyen portable de le faire ? Le code fourni ci-dessus doit être portable sur différents compilateurs prenant en charge 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal