"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment implémenter une fonction de hachage générique pour les tuples dans les collections non ordonnées?

Comment implémenter une fonction de hachage générique pour les tuples dans les collections non ordonnées?

Publié le 2025-03-26
Parcourir:358

How to Implement a Generic Hash Function for Tuples in Unordered Collections?

Fonction de hachage générique pour les tuples dans les collections non ordonnées

Le std :: non ordonné_map et std :: non ordonné les conteneurs. Cependant, l'utilisation de tuples comme touches dans ces collections sans définir une fonction de hachage personnalisée peut conduire à un comportement inattendu.

pour rectifier cela, une approche consiste à définir manuellement une fonction de hachage pour le type de tuple spécifique, tel que:

template
struct std::hash<:tuple int>> {
  size_t operator()(std::tuple const& tuple) const { ... }
};

Bien que cette approche fonctionne, il peut être fastidieux de définir les fonctions de hachage pour chaque type de tuple utilisé. Pour automatiser cela, une fonction de hachage générique peut être implémentée comme suit:

#include 

namespace std {
  namespace {

    // Code derived from Boost
    template
    inline void hash_combine(std::size_t& seed, T const& v) { ... }

    // Recursive template code from Matthieu M.
    template::value - 1>
    struct HashValueImpl { ... };

  }

  template
  struct hash<:tuple>> {
    size_t operator()(std::tuple const& tuple) const { ... }
  };
}

Cette fonction exploite la recherche de nom dépendant de l'argument (ADL) pour permettre au compilateur de sélectionner automatiquement l'implémentation du hachage correct basé sur le type de tuple. Pour une solution conforme aux normes, un espace de noms personnalisé peut être créé et utilisé pour définir la fonction de hachage:

espace de noms my_hash { // Forme les types de non-tuple au hachage std :: modèle struct hash {...}; // fournit le hachage optimisé pour les tuples modèle struct hash > {...}; } Lorsque vous utilisez cette solution, la collection non ordonnée doit référencer explicitement l'implémentation de hachage personnalisée comme suit:

non ordonné_set , std :: hash >, std :: equal_to > > test;

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3