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

MFC Discussion :

Trier un CArray d'objet personnalisé


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Par défaut Trier un CArray d'objet personnalisé
    Bonjour,

    Je vous explique mon problème :

    J'ai une classe qui s'appelle SLigne qui contient entre autre un élément CString.
    J'ai un CArray de SLigne, et j'aimerai trier ce tableau en fonction de l'élément CString de l'objet SLigne (je sais pas si je suis bien clair).

    J'ai utilisé qsort dans un premier temps, mais sans succes, ensuite j'ai lu qu'on utilisait plus qsort mais std::sort, mais je n'arrive pas à l'utiliser sur un CArray.

    Quelqu'un pourrait m'indiquer un moyen pour arriver à trier ce CArray ?

    Merci par avance.

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    std::sort provient de la librairie standard du C++, la STL. A utiliser donc sur un des conteneurs de la STL (vector, list, deque, set, ...).
    Je ne connais pas d'algorithmes de tri agissant sur les conteneurs MFC. Mais même si de tels algorithmes existent, je te conseille de passer par la STL, plus puissante et plus optimisée.

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Je te propose d'échanger ton CArray pour un std::vector ...
    Mais sinon, c'est tout à fait possible avec std::sort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <algorithm>
     
    CArray<int, int&> MyCArray;
    CStringArray MyStringArray;
     
    // Sort the CArray of ints
    std::sort(MyCArray.GetData(), MyCArray.GetData() + MyCArray.GetSize());
     
    // Sort the CStringArray
    std::sort(MyStringArray.GetData(), MyStringArray.GetData() + MyStringArray.GetSize());
    ou encore ...
    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
     
    #include <algorithm>
     
    bool SortDescendingInt(const int& x, const int& y)
    {
       return x > y;
    }
     
    bool SortDescendingString(const CString& s1, 
                              const CString& s2)
    {
       return s1 > s2;
    }
     
    CArray<int, int> MyCArray;
    CStringArray MyStringArray;
     
    // Sort the CArray of ints
    std::sort(MyCArray.GetData(), 
              MyCArray.GetData() + MyCArray.GetSize(), 
              SortDescendingInt);
     
    // Sort the CStringArray
    std::sort(MyStringArray.GetData(), 
              MyStringArray.GetData() + MyStringArray.GetSize(),
              SortDescendingString);

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Par défaut
    Citation Envoyé par Alp Voir le message
    Je te propose d'échanger ton CArray pour un std::vector ...
    Mais sinon, c'est tout à fait possible avec std::sort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <algorithm>
     
    CArray<int, int&> MyCArray;
    CStringArray MyStringArray;
     
    // Sort the CArray of ints
    std::sort(MyCArray.GetData(), MyCArray.GetData() + MyCArray.GetSize());
     
    // Sort the CStringArray
    std::sort(MyStringArray.GetData(), MyStringArray.GetData() + MyStringArray.GetSize());
    ou encore ...
    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
     
    #include <algorithm>
     
    bool SortDescendingInt(const int& x, const int& y)
    {
       return x > y;
    }
     
    bool SortDescendingString(const CString& s1, 
                              const CString& s2)
    {
       return s1 > s2;
    }
     
    CArray<int, int> MyCArray;
    CStringArray MyStringArray;
     
    // Sort the CArray of ints
    std::sort(MyCArray.GetData(), 
              MyCArray.GetData() + MyCArray.GetSize(), 
              SortDescendingInt);
     
    // Sort the CStringArray
    std::sort(MyStringArray.GetData(), 
              MyStringArray.GetData() + MyStringArray.GetSize(),
              SortDescendingString);
    Merci pour ta réponse, mais là ça marche uniquement pour les CStringArray ou CArray de int, dès qu'on veut utiliser un CArray d'autre chose, ça marche plus

    Et j'aimerai bien rester en CArray

  5. #5
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par specialka Voir le message
    Merci pour ta réponse, mais là ça marche uniquement pour les CStringArray ou CArray de int, dès qu'on veut utiliser un CArray d'autre chose, ça marche plus
    Bien sûr, il faut que les opérateurs de comparaison de ton "quelque chose" soient définis. Ou alors tu passes par des foncteurs, le deuxième exemple d'Alp, dans lesquels c'est toi qui définit sur quoi va se baser std::sort pour faire son tri.

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Il faut savoir que par défaut, sort se base sur l'opérateur < pour comparer deux éléments du conteneur. Si tu l'appelles sans préciser un 3ème argument, il cherchera un opérateur < pour comparer tes éléments. S'il n'en trouve pas, erreur de compilation.
    Si tu précises un troisième argument, c'est un prédicat de comparaison qui remplacera l'opérateur <... Tu peux ainsi comparer les attributs des éléments du conteneur et un peu tout ce que tu veux au lieu de simplement comparer les éléments eux-mêmes.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    Bien sûr, il faut que les opérateurs de comparaison de ton "quelque chose" soient définis. Ou alors tu passes par des foncteurs, le deuxième exemple d'Alp, dans lesquels c'est toi qui définit sur quoi va se baser std::sort pour faire son tri.
    j'avais bien saisi, voilà la fonction que j'avais écrite pour comparer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int CTriTableau::CompareLigne(void const *a, void const *b)
    {
     
     
       CString pa = (*((SLigne**)a))->GetNom();
       CString pb = (*((SLigne**)b))->GetNom();
     
       /* evaluer et retourner l'etat de l'evaluation (tri croissant) */
       return strcmp (pa, pb);
    }

    et je l'appelais dans qsort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(Fichier->GetTab()->GetData(),Fichier->GetTab()->GetData()+Fichier->Tab()->GetSize(),CompareLigne);
    (en fait le tableau est dans une classe Fichier, c'est pour ça que j'appelle le tableau de cette façon)

    malgré ça, ça fonctionne toujours pas.

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

Discussions similaires

  1. Disponibilité d'un objet personnalisé
    Par Domi2 dans le forum VBA Access
    Réponses: 0
    Dernier message: 11/09/2007, 16h09
  2. Trier une liste d'objets d'après un champ des objets
    Par gids01 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 02/07/2007, 09h52
  3. [Tableaux] Trier un tableau d'objets
    Par mnem0 dans le forum Langage
    Réponses: 4
    Dernier message: 21/06/2007, 15h08
  4. [Tableaux] Trier un tableau d'objet
    Par boux2 dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2007, 09h12
  5. Réponses: 5
    Dernier message: 13/06/2006, 11h08

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