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 :

[debutante][list] trier avec sort()


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut [debutante][list] trier avec sort()
    Rebonjour,

    Voila j'utilise la classe list de la std et j'ai vu que cette classe possede une methode de tri. Il faut d'apres la doc simplement surcharger l'operateur '<'
    Alors voila ma liste a trier est une liste d'objet exon dont voici un raccourci de la definition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class exon
    {
      int num;
      int deb;
      int fin;
     
     public:
      exon(void);
      exon(int,int,int);
      bool operator<(exon&);
    };

    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool exon::operator<(exon &e)
    {
      return (deb < e.getDeb() );
    }
    Puis voici comment j'utilise ma liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    list<exon*> lst;
    ... //remplissage de la liste
    lst.sort();
    Et bien le .sort() ne change absolument rien... Ma liste ne se trie pas elle reste tel qu'elle était auparavant...
    Il est bien possible que je n'ai pas encore tout saisi


    Merci pour votre aide toujours précieuse !

  2. #2
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Salut,

    En fait, puisque tu as une
    La methode sort() va effectuer la comparaison sur les pointeurs, et donc, vraissemblablement, les trier par adresse. Ce qu'il faut, c'est soit faire une liste par valeur:
    Ou alors (parceque par valeur ca arrange pas forcément), définir un foncteur de comparaison :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct ExonCompare : std::binary_function<const Exon*, const Exon*, bool> 
    {
       bool operator () ( const Exon* p1, const Exon* p2 ) const
       {
            // attention, si getDeb() n'est pas const, le compilateur ne va peut être pas être content
            return ( p1->getDeb() < p2->getDeb() ); 
       }
    };
    Et le passer en paramètre à sort() : lst.sort( ExonCompare() ).
    Voilà, ça devrait aller mieux, tiens nous au courant

  3. #3
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Ou sinon une autre méthode, si tu veux garder l'operateur de comparaison que tu as défini pour la classe Exon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <typename T>
    struct ComparerPointeurs : std::binary_function<const T*, const T*, bool>
    {
       bool operator()(const T* x, const T* y) const
       {
           return std::less<T>()(*x, *y);
       }
    };
     
    lst.sort( ComparerPointeurs() );
    Ce foncteur là, plus générique, va appeler std::less sur les objets pointés (peu importe leur type !), ce qui va donc appeler l'operateur '<' que tu as défini

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    Ok je dois effectivement a priori garder une liste de pointeurs sur des exons... Je ne connais pas du tout les deux autres methodes mais je vais essayer de m'y mettre et je vous tiens effectivement au courant !!


  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    Bon j'ai donc choisi la premiere methode... Mon exon .cc compile parfaitement en mettant getDeb() constante.
    Par contre j'ai une rreur de compilation au niveau de la ligne lst.sort(ExonCompare()) :

    sim4Results.cc:134: error: `exonCompare' undeclared (first use this function)
    Je precise que mon exon.h est bien inclus dans sim4Results.cc ...

  6. #6
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Question toute bête, mais "exonCompare" a bien été défini avec un 'e' minuscule ? On sait jamais

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    Oui en fait moi je l'ai ecrit avec un 'e' minuscule...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct exonCompare : std::binary_function<Const exon*, const exon*, bool>
        {
          bool operator() (const exon* p1, const exon*p2) const
          {
    	return (p1->getDeb() < p2->getDeb());
          }
        };
    et :
    Par contre j'ais mis la structure dans la zone public de la definition du .h. C'est bien ici qu'il faut la mettre ?

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lst.sort( ComparerPointeurs() );
    tu as oublié quelque chose...

  9. #9
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Il y a un problème: en fait il faut passer une instance de la classe exonCompare à la méthode sort():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lst.sort( exonCompare() )
    Je ne sais pas si ca va résoudre le problème, parceque le message d'erreur ne correspond pas vraiment, mais en tout cas il faut modifier ce bout de code là

    edit:

    Par contre j'ais mis la structure dans la zone public de la definition du .h. C'est bien ici qu'il faut la mettre ?
    Qu'est ce que tu appeles "zone publique" ? Ce foncteur doit être placé à un endroit accessible (le .h, c'est parfait), et en dehors de la classe Exon.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    Non désolée j'ai mal recopie le code... j'ai bien mis des parentheses, le pb ne vient pas de la...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lst.sort(exonCompare());

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Par défaut
    J'avais effectivement mis la structure dans la classe exon... Depuis je l'ai sorti et ca marche impeccable! Merci bcp a tous ceux qui m'ont aidé une fois de plus!!

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

Discussions similaires

  1. trier avec sort
    Par ghostrider95 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 21/02/2011, 14h40
  2. Trier une liste d'instance avec sort()
    Par Yachas dans le forum Général Python
    Réponses: 7
    Dernier message: 10/02/2011, 03h31
  3. Trier un List avec Sort by et Group By
    Par Cedric33 dans le forum C#
    Réponses: 9
    Dernier message: 05/09/2009, 17h53
  4. Trier fichier avec sort
    Par gdev7 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 19/08/2008, 21h50
  5. Réponses: 4
    Dernier message: 19/02/2008, 13h46

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