hash_set est bien une extension STL qui vient historiquement de l'implémentation SGI (et qui a été reprise dans gcc et msvc).
le namespace à utiliser est (compilo-dépendant) std ou std::ext ou stdext, etc.
pour les différents paramètres template :
hash_set<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
on a les paramètres par défaut suivant : _HashFcn = std::hash<_Value>, _EqualKey = std::equal_to<_Value> et _Alloc = std::alloc
comme std::hash n'est pas instanciable (difficile de prévoir toutes les classes du monde en avance pour la fonction de hachage), il te reste à définir une classe foncteur que tu passes en paramètre en tant que classe de hachage pour Couple.
Par contre, il n'est pas nécessaire de devoir comparer deux hashes (qui par définitions sont de type size_t) mais bien deux clés (et cela sera effectif par ta surcharge de l'opérator == appelé à travers std::equal_to).
Enfin, l'opérateur < n'a rien à voir là dedans, il sert dans les set qui sont des structures ordonnées mais est inutile pour les containeurs non ordonnés que sont les hash_set et autres hash_map.
Si le paramètre T de ton couple dispose d'une fonction de hash prédéfinie, tu peux utiliser quelque chose comme
[^] # Re: Il manque quelque chose
Posté par aedrin . En réponse au message STL : hash_set, utiliser une classe en paramètre. Évalué à 3.
le namespace à utiliser est (compilo-dépendant) std ou std::ext ou stdext, etc.
pour les différents paramètres template :
hash_set<class _Value, class _HashFcn, class _EqualKey, class _Alloc>
on a les paramètres par défaut suivant : _HashFcn = std::hash<_Value>, _EqualKey = std::equal_to<_Value> et _Alloc = std::alloc
comme std::hash n'est pas instanciable (difficile de prévoir toutes les classes du monde en avance pour la fonction de hachage), il te reste à définir une classe foncteur que tu passes en paramètre en tant que classe de hachage pour Couple.
Par contre, il n'est pas nécessaire de devoir comparer deux hashes (qui par définitions sont de type size_t) mais bien deux clés (et cela sera effectif par ta surcharge de l'opérator == appelé à travers std::equal_to).
Enfin, l'opérateur < n'a rien à voir là dedans, il sert dans les set qui sont des structures ordonnées mais est inutile pour les containeurs non ordonnés que sont les hash_set et autres hash_map.
Si le paramètre T de ton couple dispose d'une fonction de hash prédéfinie, tu peux utiliser quelque chose comme
template <typename T>
struct HashFn
{
const size_t operator()(const Couple<T>&c) const
{ return 13*hash(c.x) + 7*hash(c.y); }
};
exemple purement gratuit évidemment (je ne connais pas le pb plus en détail).
tu appelles ensuite hash_set<Couple<T>, HashFn<T> >
my 2 cents