Maison > développement back-end > C++ > Comment puis-je spécialiser `std::hash::operator()` pour les types personnalisés en C ?

Comment puis-je spécialiser `std::hash::operator()` pour les types personnalisés en C ?

Susan Sarandon
Libérer: 2024-11-30 00:35:14
original
396 Les gens l'ont consulté

How Can I Specialize `std::hash::operator()` for Custom Types in C  ?

Spécialiser std::hash::operator() pour les types définis par l'utilisateur

Pour exploiter les conteneurs non ordonnés avec des types définis par l'utilisateur types de clés, tels que std::unordered_set et std::unordered_map, vous devez généralement définir Operator==(Key, Key) et un foncteur de hachage. Cependant, il peut être préférable d'utiliser une fonction de hachage par défaut pour de tels types, comme c'est le cas pour les types intégrés.

En étudiant diverses ressources, y compris le standard C, il devient évident qu'il est possible de spécialisez std::hash::operator() pour les types définis par l'utilisateur. L'extrait de code suivant illustre une telle spécialisation :

namespace std {
  template <>
  inline size_t hash<X>::operator()(const X& x) const {
    return hash<int>()(x.id);
  }
}
Copier après la connexion

Maintenant, abordons les questions soulevées :

1. Légalité de la spécialisation

L'ajout de spécialisations à l'espace de noms std est non seulement autorisé mais encouragé. Il permet l'extension des capacités standard pour prendre en charge les types définis par l'utilisateur.

2. Version conforme de std::hash::operator()

La syntaxe correcte pour spécialiser std::hash::operator() est la suivante :

namespace std {
  template <>
  struct hash<X> {
    size_t operator()(const X& x) const {
      // Your custom hash function implementation
    }
  };
}
Copier après la connexion

3. Solution portable

La spécialisation std::hash démontrée précédemment nécessite une compatibilité C 11, qui peut ne pas être universellement prise en charge par les compilateurs. Pour une portabilité accrue, envisagez d'utiliser un espace de noms non standard, par exemple :

namespace ht {
  template <>
  struct hash<X> {
    // Your custom hash function implementation
  };
}
Copier après la connexion

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