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 :

Tri générique C++


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut Tri générique C++
    Bonjour,

    Je souhaite coder un une fonction de tri qui prend en entrée un pointeur sur une liste d'objets et qui me tri cette liste en fonction d'un attribut de l'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A {
        private:
            int a, b, c;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class B {
        private:
            double d, e;
    }
    Ma fonction doit pouvoir triée des listes d'objets de type A et B suivant l'attribut que je veux.

    Merci.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    On ne codera pas la fonction à ta place.
    Dis-nous ce qui te bloque/ce qui te gêne/ce que tu as déjà fait/tenté et on pourra t'aider.

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Je vois pas comment faire c'est tout :p. C'est faisable au moins ?

  4. #4
    Membre chevronné
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Par défaut
    Une bonne pratique c'est de ne pas ré-inventer la roue,
    Regarde plutôt de ce coté là
    http://www.cplusplus.com/reference/list/list/sort/
    http://www.cplusplus.com/reference/algorithm/sort/
    Surtout que pour un tri générique, il sera dur de faire mieux que la STL (où alors tu n'aurais pas besoin de poser la question sur ce forum)

    Dans certains cas il se peut que tu veuilles implémenté un algo précis, mais il faudra nous en dire plus

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Je pense pas que se que je demande existe déjà.

    Si je reprend mon exemple de la classe A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A {
        private:
            int a, b, c;
        public:
            A(int inA, int inB, int inC) { 
                a = inA; b = inB; c = inC;
            }
    }
    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
    int main() {
        A a1(1, 2, 3), a2(3, 1, 2), a3(2, 3, 1);
        QList<A> listeATrier;
     
        listeATrier.push_back(a1);
        listeATrier.push_back(a2);
        listeATrier.push_back(a3);
     
        cout << listeATrier << "\n";
     
        // Tri décroissant
        Sort(listeATrier, A::a); cout << listeATrier;
        Sort(listeATrier, A::b); cout << listeATrier;
        Sort(listeATrier, A::c); cout << listeATrier;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    console :
    a1, a2, a3
     
    a2, a3, a1
    a3, a1, a2
    a1, a2, a3
    J'écris n'importe quoi mais c'est pour comprendre

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    En fait ce que tu veux faire nécessite un mécanisme d’introspection, pas présent en standard en c++.

    Donc en C++, tu ne peux pas trier selon un « attribut », tu peux trier en revanche selon un « comparateur ».

    Donc ce que tu veux faire serait plus proche de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       Sort(listeATrier, compareAOnA); cout << listeATrier;
        Sort(listeATrier, compareAOnB); cout << listeATrier;
        Sort(listeATrier, compareAOnC); cout << listeATrier;

  7. #7
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Moi je veux triée par rapport aux attributs.

  8. #8
    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
    Citation Envoyé par white_tentacle Voir le message
    En fait ce que tu veux faire nécessite un mécanisme d’introspection, pas présent en standard en c++.

    Donc en C++, tu ne peux pas trier selon un « attribut », tu peux trier en revanche selon un « comparateur ».
    Je ne vois pas en quoi tu ne pourrais pas, avec le code qu'il faut:
    Code C++ : 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
    template<class obj, class attr>
    struct comparateur_attribut
    {
    	attr obj::* pAttribut;
    	bool operator() (obj const &left, obj const &right)
    	{
    		return left.*pAttribut < right.*pAttribut;
    	}
    };
     
    template<class obj, class attr>
    sort(QList<obj> &objetsATrier, attr obj::* pAttribut)
    {
    	//obtenir itérateurs
    	//...
    	comparateur_attribut cmp;
    	cmp.pAttribut = pAttribut;
    	std::sort(itDebut, itFin, cmp);
    }
     
        Sort(listeATrier, &A::a); cout << listeATrier;
        Sort(listeATrier, &A::b); cout << listeATrier;
        Sort(listeATrier, &A::c); cout << listeATrier;
    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.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<A> liste { {1, 2, 3}, {3, 1, 2}, {2, 3, 1} };
    std::sort(liste.begin(), liste.end(), [](A const& lhs, A const& rhs) {return lhs.b < rhs.c; });
    Tu peux aussi t'amuser à définir des foncteurs qui vont simplifier l'écriture.
    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
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <iterator>
     
    struct A {
        int a;
        float b;
        std::string c;
        friend std::ostream & operator<<(std::ostream & os, const A & v)
        {
            return os << "{" << v.a << ", " << v.b << ", " << v.c << "}";
        }
    };
     
    template <class T, class V> struct sort_by_impl {
        sort_by_impl(V T::*p) : m_p(p) {}
        bool operator()(T const& lhs, T const& rhs) const
        { return lhs.*m_p < rhs.*m_p; }
    private:
        V T::*m_p;
    };
     
    template <class T, class V> sort_by_impl<T,V> sort_by(V T::*p) { return sort_by_impl<T,V>(p); }
     
    int main ()
    {
        std::vector<A> a{
            {1, 12.5, "z"},
            {2, 2.5, "b"},
            {3, 42.5, "a"}
        };
        std::copy(a.begin(),a.end(), std::ostream_iterator<A>(std::cout, "\n"));
     
        std::cout << "a\n";
        std::sort(a.begin(),a.end(), sort_by(&A::a));
        std::copy(a.begin(),a.end(), std::ostream_iterator<A>(std::cout, "\n"));
        std::cout << "b\n";
        std::sort(a.begin(),a.end(), sort_by(&A::b));
        std::copy(a.begin(),a.end(), std::ostream_iterator<A>(std::cout, "\n"));
        std::cout << "c\n";
        std::sort(a.begin(),a.end(), sort_by(&A::c));
        std::copy(a.begin(),a.end(), std::ostream_iterator<A>(std::cout, "\n"));
    }
    // Vim: let $CXXFLAGS='-std=c++0x'
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. tri générique entre objets
    Par cashmoney dans le forum Langage
    Réponses: 31
    Dernier message: 12/03/2009, 14h03
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25
  4. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 10h19
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

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