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 :

operator pour std::set avec des pointeurs


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Mars 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Mars 2023
    Messages : 3
    Points : 2
    Points
    2
    Par défaut operator pour std::set avec des pointeurs
    Bonjour,

    J'ai un std::set dans lequel je mets des objets (et non pas des pointeurs), j'ai redéfini l'opérateur < et tout fonctionne bien.
    Maintenant je veux faire la même chose dans le cas où le std::set prend des pointeurs vers mes objets, j'ai ajouté un opérateur qui prend des pointeurs et compare les objets pointés mais quand j'insère mes pointeurs d'objets dans le std::set le code ne passe même pas dans cet opérateur (donc il ne compare rien et me rend des doublons). Voici mon code :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    class CNode
    {
    private:
        int      m_nID;
     
    public:
        CNode() : m_nID{0} {}
        CNode(int n) : m_nID{n} {}
     
        bool operator <( const CNode& p ) const
        {   return m_nID < p.m_nID; } // OK, working fine!!!
     
        bool operator <( CNode* p ) const
        {   return m_nID < p->m_nID; } // Not working (it is not even passing through).
     
        void  PrintID() const { cout << m_nID << endl; }
    };
     
    int main()
    {
        CNode* pNode1  = new CNode{1};
        CNode* pNode2  = new CNode{2};
        CNode* pNode3  = new CNode{1};
     
        std::set<CNode> setNode;
        setNode.insert(*pNode1);
        setNode.insert(*pNode2);
        setNode.insert(*pNode3);
     
        for (std::set<CNode>::iterator iter = setNode.begin();
             iter != setNode.end(); iter++)
        {
            (*iter).PrintID();
        }
        // With object it is working fine, only 2 objects:
        // 1
        // 2
     
        std::set<CNode*> setNode2;
        setNode2.insert(pNode1);
        setNode2.insert(pNode2);
        setNode2.insert(pNode3);
        cout << endl;
     
        for (std::set<CNode*>::iterator iter = setNode2.begin();
             iter != setNode2.end(); iter++)
        {
            (*iter)->PrintID();
        }
        // With pointers it is not working, three objects with duplicate:
        // 1
        // 2
        // 1
     
        delete pNode1, pNode2, pNode3;
        return 0;
    }
    Pouvez-vous m'aider à modifier mon opérateur qui prend des pointeurs et compare les objets pointés.
    Merci.

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Ton second operator< compare un CNode& à un Cnode*, Mais toi tu veux plutôt ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    friend bool operator <(  CNode const* a, CNode const* p )
        {   return a->m_nID < p->m_nID; }
    et ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        delete pNode1, pNode2, pNode3;
    Ne détruit que le pNode3.

    Et il ne faut jamais utiliser new ni delete. Il existe des tas de moyen simples de gérer la mémoire dynamique (mais ça se faisait au précédent millénaire), qui donc peut t'apprendre ces choses?

  3. #3
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Mars 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Mars 2023
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de votre réponse,

    En effet j'ai appris la programmation au siècle dernier, et bien avant new et delete j'ai commencé avec malloc et free .... mais ce n'est pas le sujet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    friend bool operator <(  CNode const* a, CNode const* p )
        {   return a->m_nID < p->m_nID; }
    Oui c'est ce qu'il me faudrait, j'ai essayé mais j'ai des erreurs à compile time.
    Avez-vous essayé cette ligne sur l'extrait de code que j'ai écrit en premier post ?

    J'ai essayé ceci par contre, dans le même modèle que ce que vous proposez, ce n'est pas ce qu'il me faut mais cela compile bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    friend bool operator< ( const A& a, const A& p ) {
            return (a.operator<(p));
     }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete pNode1, pNode2, pNode3;
    Ne détruit que le pNode3.
    Oui effectivement, c'était juste pour gagner quelques lignes dans le message destiné au forum.

    Merci de votre aide.

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    J'ai, en effet, répondu un peu trop vite.
    On ne peut pas redéfinir une comparaison entre 2 pointeurs. Elle existe par défaut! et aucun operateur ne peut changer ce qui existe entre 2 scalaires.

    Il faut ici, "expliquer" à std::set comment trier. Ca peut être fait par un "foncteur" (ou une lambda depuis le C++11), je donne l'exemple avec le 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
     // une classe globale "foncteur" qui compare les pointeurs
    struct CompPtrCNode {
       bool  operator()( CNode const* a, CNode const* p )const {
          return  *a < *p;
       }
    };
     
    int  main()
    {
        ...
       std::set<CNode*, CompPtrCNode> setNode2;  // et indiquer ce "foncteur" a std::set
       setNode2.insert(pNode1);
       setNode2.insert(pNode2);
       setNode2.insert(pNode3);
        ...
    }

  5. #5
    Candidat au Club
    Homme Profil pro
    autre
    Inscrit en
    Mars 2023
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Mars 2023
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Cela fonctionne très bien, merci beaucoup c'est parfait.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/03/2007, 10h55
  2. Réponses: 8
    Dernier message: 11/03/2007, 18h10
  3. Réponses: 2
    Dernier message: 21/02/2007, 13h28
  4. find() de std::set avec fonction de comparaison
    Par Biglo dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/01/2006, 08h50
  5. Probleme avec des pointeurs...
    Par barucca dans le forum C++
    Réponses: 5
    Dernier message: 23/08/2005, 21h05

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