Maison > développement back-end > C++ > Comment étendre la fonction de hachage standard pour les types personnalisés dans les conteneurs C non ordonnés ?

Comment étendre la fonction de hachage standard pour les types personnalisés dans les conteneurs C non ordonnés ?

Barbara Streisand
Libérer: 2024-12-04 17:46:11
original
1076 Les gens l'ont consulté

How to Extend the Standard Hash Function for Custom Types in C   Unordered Containers?

Extension du hachage standard pour les types personnalisés dans des conteneurs non ordonnés

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 :

  1. Est-il permis d'ajouter une telle spécialisation à l'espace de noms std ?
  2. Quelle version de std::hash::operator() , le cas échéant, est conforme à la norme C 11 ?
  3. Existe-t-il une approche indépendante de la plate-forme pour atteindre ceci ?

Extension de l'espace de noms standard

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.

Spécialisations conformes à C 11

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

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.

Implémentation portable

Malheureusement, il n'existe pas de méthode indépendante de la plate-forme pour spécialiser std::hash::operator() en C . L'implémentation d'une fonction de hachage personnalisée dans l'espace de noms std nécessite soit une implémentation spécifique au compilateur, soit l'utilisation d'une bibliothèque tierce.

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