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 :

sort() d'une std::list en utilisant l'opérateur <


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de yuukuari
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Par défaut sort() d'une std::list en utilisant l'opérateur <
    Salut, j'ai un problème avec la méthode sort d'une std::list pour les entiers.
    Je m'explique:
    J'ai un tableau qui récapitule les infos (Nom, Forme, Température, ..) d'une liste de composants électriques (cables, fusibles, etc...). Lorsque je clique sur une colonne, je voudrais que les éléments de mon tableau s'ordonnent en fonction de la colonne cliquée (un peu à la façon de l'explorateur windows par exemple).
    Pour faire cela, je récupère d'abord tous les composants électriques (de type CElectricalElement*) dans une std::list. Ces objets étant assez lourds et pour pouvoir les ordonner plus facilement, j'ai recréé une classe spécialement pour cette opération:
    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
    class TabAdapter {
            public:
                TabAdapter() {ptr = 0;}
                TabAdapter(CElectricalElement * p, wxString& selected_column_name, bool display_from_lowest_to_biggest) {
                   ptr = p; 
                   mSelectedColumnName = selected_column_name; 
                   mDisplayFromLowestToBiggest = display_from_lowest_to_biggest;
                }
                CElectricalElement * getPtr() {return ptr;}
                void setPtr(CElectricalElement * p) {ptr = p;}
                //bool operator < (TabAdapter & other) {return (this->getPtr()->getName() < other.getPtr()->getName());}
                bool operator < (TabAdapter & other);
            private:
                CElectricalElement * ptr;
                wxString mSelectedColumnName;
                bool mDisplayFromLowestToBiggest;
        };
    L'objet TabAdapter est donc (presque) juste un CElectricalElement avec l'opérateur < redéfini. On rempli une nouvelle liste avec ces TabAdapter.

    Lorsqu'on appelle la méthode sort() de cette nouvelle liste, il sort une liste classée en fonction de ma fonction bool operator < (TabAdapter & other);
    Jusqu'ici tout va bien, j'ai déjà réussi à classer ma liste en fonction du nom ou du type de composant. Seulement dès que je compare le numéro des composants (un double), le programme compile mais crash.

    La méthode redéfinissant l'opérateur < est comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       bool TabAdapter::operator < (TabAdapter & other) {
          if (mSelectedColumnName == wxT("Name"))
             if (mDisplayFromLowestToBiggest == true) return (this->getPtr()->getName() < other.getPtr()->getName());
             else return (other.getPtr()->getName() < this->getPtr()->getName());
     
          else if (mSelectedColumnName == wxT("Length"))
             if (mDisplayFromLowestToBiggest == true) return (this->getPtr()->getLength() < other.getPtr()->getLength());
             else return (other.getPtr()->getLength() < this->getPtr()->getLength());
    }
    mSelectedColumnName : nom de la colonne cliquée
    mDisplayFromLowestToBiggest : sens d'ordonnancement

    Je ne comprend pas pourquoi il n'arrive pas à comparer ces fouttus doubles :/ j'ai aussi essayé de les passer en string mais ça ne marche toujours pas..
    J'aimerais éviter de devoir rechanger toute ma structure mais si c'est la seule solution alors tant pis :'(

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour une comparaison non-égale, un simple '<' devrait suffire pour les double...
    PS: Ton code manque de const. Typiquement, l'opérateur < devrait prendre une référence const en paramètre et être lui-même déclaré const...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé Avatar de yuukuari
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Par défaut
    Je viens de m'apercevoir d'un truc, TabAdapter contient tous les composants électriques. Le problème c'est que mon tableau a plusieurs onglets (un pour les cables, un pour les fusibles, etc..).

    Si je suis dans l'onglet "cables" et que je décide d'ordonner par rapport à l'attribut "Longueur", alors dans mon algorithme il va reclasser tous les éléments de ma liste en appelant sur chacun la méthode "GetLength()" indépendamment de son type..

    Jvais essayer de créer une liste différente pour chaque type de composant que je veux manipuler, ça règlera surement le problème.. Si c'est le cas alors désolé mon problème venait de la conception
    Je me disais bien que c'était bizarre de pas pouvoir classer par doubles ..

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il faudrait plutôt que tu classes selon un foncteur différent à chaque fois, plutôt que de redéfinir l'opérateur '<'.
    En utilisant la fonction std::stable_sort() sur ta liste, tu pourras trier tes éléments selon le nouvel ordre, sans chambouler l'ordre résultant des critères précédents.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ce qu'il te faut c'est plutôt un multi index, apparemment.

  6. #6
    Membre confirmé Avatar de yuukuari
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 65
    Par défaut
    Finalement ça marche en utilisant une liste différente à chaque fois

    Je ne connais pas "std::stable_sort()", cela permet de faire plusieurs classements différents à l'intérieur d'une liste ? par exemple:
    Une liste contient 30 éléments avec: 10 éléments du type 1, 10 éléments du type 2 et 10 du type 3. Je pourrais classer les éléments de chaque type suivant une règle qui leur est propre ? Si c'est le cas alors oui j'aurais très bien pu utiliser ça !

    Et par multi index, tu veux dire quoi par là ?

    Yuukuari

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

Discussions similaires

  1. Création de mutex ou section critique associés à une STD::LIST
    Par lika_lika dans le forum Threads & Processus
    Réponses: 0
    Dernier message: 05/11/2010, 17h23
  2. rendre une std::list circulaire
    Par SKone dans le forum SL & STL
    Réponses: 8
    Dernier message: 31/03/2009, 23h00
  3. Réponses: 5
    Dernier message: 23/09/2008, 13h29
  4. Recherche dans une std::list et suppression.
    Par Nyko17 dans le forum SL & STL
    Réponses: 5
    Dernier message: 02/05/2008, 12h53
  5. [cast] dans le cas d'une Std::list
    Par ZaaN dans le forum SL & STL
    Réponses: 9
    Dernier message: 26/10/2006, 10h07

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