IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

std::unordered_set et std::hash


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre tr�s actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Avril 2012
    Messages
    538
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par d�faut std::unordered_set et std::hash
    Bonjour,

    je souhaite cr�er une classe 'Ensemble' qui h�rite de 'std::unordered_set' :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    template<class T>
    class Ensemble : public std::unordered_set<T> {
        ...
    }
    J'ai plusieurs classe qui h�rite de la classe 'Element' :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    class A : public Element { ... }
    class B : public Element { ... }
    J'ai d�fini la fonction de Hashage pour 'Element' :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace std {
        template <>
        struct hash<Element> {
            size_t operator()(const Element & e) const noexcept {
                return e.getId(); // Unique Id
            }
        };
    }
    Le probl�me c'est que je ne parviens pas � faire des ensemble de A ou B :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    int main() {
        Ensemble<Element> mySet_1; // Ok  
        Ensemble<A> mySet_2; // Pas Ok
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    error: no match for call to '(const std::hash<A>) (const A&)'|
    Quelqu'un peut-il m'expliquer le fonctionnement de std::hash ? Ou est l'erreur ? Merci.

  2. #2
    Expert confirm�

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Software Developer
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par d�faut
    Salut!

    Pour commencer, les conteneurs de la STL ne sont pas fait pour faire partie d'un h�ritage (tu verras qu'il n'y a aucune fonction membre virtuelle dans ces classes).
    Je te conseille donc de mettre ton std::unordered_set en tant que membre de ta classe Ensemble, quitte � forwarder les fonctions dont tu as besoin (begin, end, find, insert...).

    Ensuite, pour ton probl�me, tu as d�fini un hash pour Element, mais pas pour A.
    Tu remarqueras qu'il te demande bien un std::hash< A >, cela ne tient pas compte de l'h�ritage que tu as mis en place.
    Tu peux le d�finir comme ceci, en utilisant ton std::hash< Element >:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace std {
        template <>
        struct hash<A> {
            size_t operator()(const A & a) const noexcept {
                return hash<Element>()( a );
            }
        };
    }
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert � rien, mais qu'il est joli (des fois) : ProceduralGenerator (G�n�ration proc�durale d'images, et post-processing).

  3. #3
    Membre tr�s actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Avril 2012
    Messages
    538
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par d�faut
    Citation Envoy� par dragonjoker59 Voir le message
    Ensuite, pour ton probl�me, tu as d�fini un hash pour Element, mais pas pour A.
    Tu remarqueras qu'il te demande bien un std::hash< A >, cela ne tient pas compte de l'h�ritage que tu as mis en place.
    [/code]
    Oui j'ai bien compris. Mon but est de ne pas d�finir hash pour chaque classe : A, B, ... C'est pour cela que j'ai cr�� la classe Element. Comment faire ?

    En quoi l'h�ritage pose probl�me. J'ai besoin d'un objet std::unordered_set avec des m�thodes suppl�mentaires ... je n'ai pas le choix, non ?

  4. #4
    Membre tr�s actif
    Homme Profil pro
    �tudiant
    Inscrit en
    Avril 2012
    Messages
    538
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par d�faut
    Est-ce correct comme ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    struct HashElement {
        size_t operator() (const Element & e) const {
           return e.getId();
        }
    };
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    template<class T>
    class Ensemble : public std::unordered_set<T, HashElement> {
    ...
    }

  5. #5
    Expert confirm�

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Software Developer
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par d�faut
    A part pour l'h�ritage, oui.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert � rien, mais qu'il est joli (des fois) : ProceduralGenerator (G�n�ration proc�durale d'images, et post-processing).

  6. #6
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par dragonjoker59 Voir le message
    A part pour l'h�ritage, oui.
    Quel est le probl�me avec cet h�ritage, s'il ne fait pas de polymorphisme ?

  7. #7
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Salut,

    bah l'erreur, le compilateur te l'indique, error: no match for call to '(const std::hash<A>) (const A&)'| que ne comprends-tu pas ?
    Il n'existe aucune fonction std::hash<A>.. et pourquoi faire un h�ritage de std::unordered_set ? C'est peu commun et peu recommand�.
    De m�me que ta fa�on d'utiliser un std::unordered_set. Il existe un param�tre template pour d�finir sa fonction de hash, pas besoin de sp�cialiser le param�tre par d�faut fourni par la std.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

Discussions similaires

  1. la difference entre deux std::unordered_set
    Par mohsenuss91 dans le forum C++
    R�ponses: 7
    Dernier message: 21/04/2015, 17h30
  2. �quivalent de std::min et std::max en C?
    Par vdumont dans le forum C
    R�ponses: 2
    Dernier message: 08/10/2006, 18h15
  3. conversion std::string en std::istringstream
    Par flipper203 dans le forum SL & STL
    R�ponses: 3
    Dernier message: 06/07/2006, 18h34
  4. std::cout et std::wstring
    Par glKabuto dans le forum SL & STL
    R�ponses: 11
    Dernier message: 10/06/2006, 18h44
  5. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    R�ponses: 20
    Dernier message: 05/01/2005, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo