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

Langage C++ Discussion :

trier un set de pointeurs?


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut trier un set de pointeurs?
    Hello,
    j'ai là un problème avec mon programme qui ne me trie pas mon set ainsi défini :
    la surcharge est effectuée dans la definition de la classe ANIMAL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class ANIMAL: public RACE {
        int num;
        string nom;
        char age;
     
      public:
        ANIMAL(int nu, string no, char a, string ty):RACE(ty){num=nu; nom=no; age=a;};
        bool operator<(ANIMAL *A){ return (num >  A->num);};
     
    };
    et lors de mon affichage je me rends compte qu'il ne me trie pas les animaux sur leur numero...
    serait-ce à cause de l'utilisation de pointeurs? peut-etre fait-il le trie sur l'adresse?
    merci beaucoup

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut, et bienvenue sur le forum.

    Effectivement, un pointeur contient... une adresse à laquelle on trouvera l'objet pointé et, cette adresse étant représentée par une valeur numérique, c'est cette valeur qui est utilisée pour le tri.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    oui mais j'ai bien surchargé pourtant...
    ça reste bloqué sur l'adresse alors...
    y'aurait pas une solution détournée parce que j'ai vraiment besoin de mettre des pointeurs à cet endroit là, et il faut que ce soit trié pour l'affichage...

    serai-ce de la bidouille ou pas, lors de l'affichage, créer un conteneur temporaire contenant des "pas pointeurs" pour l'affichage?

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Le 2eme paramètre template de set est le comparateur utilisé. Tu peux en passer un perso.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    donc si je met un deuxième paramètre dans ma déclaration du set, et que je définis ma fonction (ou ça d'ailler? dans ZOO.h avant ma déclaration de classe?) il ne s'occupera plus des adresses mais bien du contenu?
    Mais quelle est la différence avec la surcharge simple que j'ai effectué dans animal.h?

  6. #6
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par evrybody
    Mais quelle est la différence avec la surcharge simple que j'ai effectué dans animal.h?
    Un set<T> est trié par défaut selon l'opérateur < du type T.

    Ici ton type T est "Animal*", donc le set sera trié selon l'opérateur < d'un Animal*. Définir un opérateur < sur le type Animal n'a aucune influence.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    ok merci je vais essayer!

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Tu peux créer ce que l'on appelle un foncteur proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct lessAnimal
    {
        bool operator()(ANIMAL * a1, ANIMAL * a2);
        { 
            return (*a1)<(*a2);
        }
    };
    et déclarer ton set sous la forme de
    std::set<ANIMAL*,lessAnimal> sani;
    et tu peux créer un alias de type (pour la facilité) proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef std::set<ANIMAL,lessAnimal> setAnimal;
    int main()
    {
        setAnimal sani;
        /*...*/
    }
    Cependant, il y a quelques remarques à faire concernant l'opérateur < de ta classe animal:
    • L'opérateur < devrait une fonction constante, surtout si tu place tes pointeurs dans un std::set
    • L'argument de l'opérateur devrait etre... une référence constante sur animal
    • l'opérateur < agit au départ de l'objet se trouvant à sa gauche... tel qu'il est implémenté par toi, il renvoie vrai si... l'objet se trouvant à droite est plus petit ou égal

    Et, pour terminer, si une fonction membre est implémentée directement dans la définition de la classe, il ne sert à rien de rajouter un point virgule après l'accolade fermante de la fonction

    Ta classe ANIMAL devrait donc être proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class ANIMAL: public RACE {
        int num;
        string nom;
        char age;
     
      public:
        ANIMAL(int nu, string no, char a, string ty):RACE(ty){num=nu; nom=no; age=a;}
        bool operator<(ANIMAL const &A) const { return (num <  A.num);}
     
    };
    PS: idéalement, les symboles écrits uniquement en majuscules sont réservés aux symboles préprocesseurs
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Un set<T> est trié par défaut selon l'opérateur < du type T.

    Ici ton type T est "Animal*", donc le set sera trié selon l'opérateur < d'un Animal*. Définir un opérateur < sur le type Animal n'a aucune influence.
    A vrai dire, c'est plutot l'inverse...

    l'opérateur < s'applique d'office entre deux objets, et un set normalement utilisé pour contenir... des objets..
    Ce n'est donc pas l'opérateur < sur le type animal qui n'a aucune influence, mais l'opérateur < sur pointeur de type animal qui... n'a aucune raison d'être...

    Il faut donc bel et bien passer par... un foncteur tel que je l'ai présenté ici
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    ça marche!
    merci bcp pour votre rapidité^^

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

Discussions similaires

  1. Trier une liste de pointeur de class
    Par lolaalol dans le forum C++
    Réponses: 10
    Dernier message: 26/01/2013, 03h42
  2. Trier un set de membres via la business key
    Par tacchinia dans le forum Cognos
    Réponses: 0
    Dernier message: 28/10/2009, 13h35
  3. Réponses: 37
    Dernier message: 18/05/2008, 23h20
  4. [conception] set de pointeurs
    Par r0d dans le forum SL & STL
    Réponses: 11
    Dernier message: 02/03/2008, 11h34
  5. trier une liste de pointeurs sur personne
    Par italiasky dans le forum SL & STL
    Réponses: 5
    Dernier message: 10/11/2007, 14h53

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