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
Barbara Streisandoriginal
2024-12-04 17:46:111094parcourir

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
    }
  };
}

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!

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