erreur pour la fonction de hachage de la paire d'entiers
J'ai la classe suivante avec un unordered_map
membre, et une fonction de hachage définis pour pair<int,int>
class abc
{public :
unordered_map < pair<int,int> , int > rules ;
unsigned nodes;
unsigned packet ;
};
namespace std {
template <>
class hash < std::pair< int,int> >{
public :
size_t operator()(const pair< int, int> &x ) const
{
size_t h = std::hash<int>()(x.first) ^ std::hash<int>()(x.second);
return h ;
}
};
}
Mais j'obtiens les erreurs suivantes :
error: invalid use of incomplete type ‘struct std::hash<std::pair<int, int> >
error: declaration of ‘struct std::hash<std::pair<int, int> >
error: type ‘std::__detail::_Hashtable_ebo_helper<1, std::hash<std::pair<int, int> >, true>’ is not a direct base of ‘std::__detail::_Hash_code_base<std::pair<int, int>, std::pair<const std::pair<int, int>, int>, std::__detail::_Select1st, std::hash<std::pair<int, int> >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>’
- Vous devez transmettre declate
template<typename T> class hash;
- Une déclaration anticipée est insuffisante. La coopérative doit définir la spécialisation avant
class abc
. - Ouais je vois que maintenant.
- Qu'arriverait-il si deux programmeurs essayé dans les deux composantes d'un même programme?
Vous devez vous connecter pour publier un commentaire.
Malheureusement, ce programme a un comportement indéfini. C++11 §17.6.4.2.1:
hash<pair<int,int>>
dépend de primitif et de la bibliothèque standard uniquement les types de. Ceci est facilement contourné par la définition de votre classe hash à l'extérieur de l'espace de nomsstd
, et l'utilisation de hachage explicitement dans votre carte de déclaration:EDIT: j'ai utilisé un xor pour combiner les valeurs de hachage de la paire de membres ici parce que je suis paresseux, mais pour un usage sérieux xor est assez minable de hachage combinant la fonction.
std::hash<T>()(x.first) ^ std::hash<T>()(x.second);
- c'est une spectaculaire collision sujettes à la façon de hachage unepair
, comme chaque paire avec deux identiques valeur hachages à 0, et chaque paire {a, b} hache le même que {b, a}. Pour vaguement exigeantes, beaucoup mieux pour trouver unhash_combine
de la fonction et de l'employer.std::hash
pourstd::pair
s mais également de ne pas vous laisser mettre en œuvre vous-même? Pourquoi?std::hash<std::pair<T, U>>
comme conforme extension. Ou C++35 peut définir une telle spécialisation. Ni serait possible, sans rupture de certains programmes - si les utilisateurs ont permis de définir de telles spécialisations eux-mêmes.Je préfère me fier sur la norme de mise en œuvre de
std::hash<uintmax_t>
de mélanger les hachages des composants d'unstd::pair
:sizeof
donne la taille en octets, mais<<
prend le nombre de bits à décaler par. en.cppreference.com/w/cpp/language/sizeof