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

SL & STL C++ Discussion :

ordered_set sur type perso


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut ordered_set sur type perso
    Bonjour,
    Je teste les unordered_set sous VS2010. Tout fonctionne parfaitement avec les type de base mais je n'arrive pas à les utiliser sur des types perso de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class myB
    {
    public:
      string ch;
      myB(const string& s):ch(s){}
    };
    void main() 
    {
       unordered_set<myB> a_hash;
       a_hash.insert(myB("Hello"));
    }
    Normal me direz vous car comment le compilo peut il savoir comment comparer et hasher myB. Certes.
    Je vais pas tout mettre ici mais j'ai essayé plusieurs choses :
    operator(), operator ==, fonctor dans la déclaration. Rien n'a compilé !

    Impossible de trouver de la doc sur le net, tous les exemples que je trouve sont fait avec des types de bases : char, string, int.
    Quelqu'un a des liens à me communiquer (ou une solution à mon problème) ? Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    void main :

    Il te faut définir soit :
    -> un opérateur== pour myB
    -> une spécialisation de std::equal_to pour myB
    -> définir ton propre foncteur avec bool operator()(const T& x, const T& y) const; et le préciser comme Prédicat dans la définition de ta variable

    Plus, il faut définir :
    -> une spécialisation de std::hash pour myB
    -> définir ton propre foncteur avec result_type operator()(argument_type const&key_)const et le préciser comme hash dans la définition de ta variable

    // spécialisations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <unordered_set>
    #include <string>
    #include <functional>
     
    class myB
    {
    public:
      std::string ch;
      myB(const std::string& s):ch(s){}
    };
     
    namespace std
    {
        template<>
        class hash<myB>
        {
        public:
            typedef size_t result_type;
            typedef myB argument_type;
     
            result_type operator()(argument_type const&key_)const
            {
               return /* ce que tu veux. La seule contrainte (k==i)=>(h(k)==h(i))*/0;
            }
        };
     
        template<>
        class equal_to<myB>
        {
            public:
          bool operator()(const myB& rhs_, const myB& lhs_) const
          { return /* ce que tu veux */ true; }
        };
    }
     
    int main()
    {
       std::unordered_set<myB> a_hash;
       a_hash.insert(myB("Hello"));
     
       return 0;
    }
    // operateur ==
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <unordered_set>
    #include <string>
    #include <functional>
     
    class myB
    {
    public:
      std::string ch;
      myB(const std::string& s):ch(s){}
    };
    bool operator==(myB const&, myB const&)
    {
        return true;
    }
     
    namespace std
    {
        template<>
        class hash<myB>
        {
        public:
            typedef size_t result_type;
            typedef myB argument_type;
     
            result_type operator()(argument_type const&key_)const
            {
               return /* ce que tu veux. La seule contrainte (k==i)=>(h(k)==h(i))*/0;
            }
        };
    }
     
    int main()
    {
       std::unordered_set<myB> a_hash;
       a_hash.insert(myB("Hello"));
     
       return 0;
    }
    // foncteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <unordered_set>
    #include <string>
     
    class myB
    {
    public:
      std::string ch;
      myB(const std::string& s):ch(s){}
    };
     
    class my_hashfor_myB
    {
    public:
       typedef size_t result_type;
       typedef myB argument_type;
     
       result_type operator()(argument_type const&key_)const
       {
          return /* ce que tu veux. La seule contrainte (k==i)=>(h(k)==h(i))*/0;
       }
    };
     
    class my_equal_to_for_myB
    {
       public:
       bool operator()(const myB& rhs_, const myB& lhs_) const
          { return /* ce que tu veux */ true; }
    };
     
    int main()
    {
       std::unordered_set<myB,my_hashfor_myB,my_equal_to_for_myB> a_hash;
       a_hash.insert(myB("Hello"));
     
       return 0;
    }

  3. #3
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Merci, je sais pas trop ce que j'avais loupé au niveau des foncteurs mais maintenant c'est ok.
    Au passage je n'avais jamais pensé à la spécialisation du template pour gérer ce genre de cas. Par contre je suis pas sur que cela soit une bonne idée de le mettre dans le namespace std

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CURSOR sur un TYPE perso
    Par escafr dans le forum PL/SQL
    Réponses: 6
    Dernier message: 01/09/2008, 11h42
  2. [FileMaker 6] Questions urgente sur type de base de donnee
    Par LAPLACE dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 06/09/2004, 17h39
  3. [Debutant]reallocation de memoire d'un tableau de type perso
    Par killerjeff dans le forum Débuter
    Réponses: 3
    Dernier message: 04/08/2004, 17h09
  4. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07
  5. ip fixeou nom de domaine sur ordi perso
    Par windob dans le forum Développement
    Réponses: 15
    Dernier message: 14/01/2004, 10h49

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