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 :

Trie d'une liste selon un critère


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut Trie d'une liste selon un critère
    Bonjour à tous!!

    Voilà tout est dans le titre, j'ai tenté de m'inspirer de la FAQ, mais ça j'ai du commettre une petite erreur quelque part.

    J'ai une classe (abstraite):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class CDrawableObject
    {
    	public:
    		CDrawableObject();
    		virtual ~CDrawableObject();
    ( ... )
            int m_Type;
    };
    une liste de pointeur sur cette classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::list<CDrawableObject*> m_InterfaceObject;
    une structure pour trier cette liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Structure pour trier les objets
    struct SortByType
    {
       bool operator ()(const CDrawableObject* a1, const CDrawableObject* a2) const
       {
          return (a1->m_Type) < (a2->m_Type);
       }
    };
    et enfin l'appelle à la fonction de trie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(m_InterfaceObject.begin(), m_InterfaceObject.end(), SortByType() );
    J'obtiens les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm:2903: error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)'ÿ: impossible de d‚duire l'argument modŠle pour 'const std::reverse_iterator<_RanIt> &' … partir de 'std::list<_Ty>::_Iterator<_Secure_validation>'
    C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm:2903: error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)'ÿ: impossible de d‚duire l'argument modŠle pour 'const std::reverse_iterator<_RanIt> &' … partir de 'std::list<_Ty>::_Iterator<_Secure_validation>'
    C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm:2903: error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)'ÿ: impossible de d‚duire l'argument modŠle pour 'const std::reverse_iterator<_RanIt> &' … partir de 'std::list<_Ty>::_Iterator<_Secure_validation>'
    C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm:2903: error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)'ÿ: impossible de d‚duire l'argument modŠle pour 'const std::reverse_iterator<_RanIt> &' … partir de 'std::list<_Ty>::_Iterator<_Secure_validation>'
    C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm:2903: error C2676: '-'ÿbinaire : 'std::list<_Ty>::_Iterator<_Secure_validation>' ne d‚finit pas cet op‚rateur ou une conversion vers un type acceptable pour l'op‚rateur pr‚d‚fini
    C:\Program Files\Microsoft Visual Studio 8\VC\include\algorithm:2903: error C2780: 'void std::_Sort(_RanIt,_RanIt,_Diff)'ÿ: 3 arguments attendus - 4 fournis
    :: === Build finished: 6 errors, 0 warnings ===

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Seuls les itérateurs à accès aléatoire sont compatibles avec std::sort -- ceux de std::vector et les pointeurs bruts.

    Pour std::list :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_InterfaceObject.sort(SortByType());

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Points : 275
    Points
    275
    Par défaut
    Tout simplement.

    Merci.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par Laurent Gomila
    Seuls les itérateurs à accès aléatoire sont compatibles avec std::sort -- ceux de std::vector et les pointeurs bruts.
    Et std::string et std::deque aussi. Pour un conteneur de CDrawableObject, je suppose que std::string ne va pas vraiment être utile, mais std::deque peut être une bonne solution.

    En fonction du nombre d'appels de la fonction de tri et de la taille de la liste, std::set, qui maintient ses éléments triés, peut également être intéressant.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et std::string et std::deque aussi
    Effectivement

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par roulious
    Et std::string et std::deque aussi. Pour un conteneur de CDrawableObject, je suppose que std::string ne va pas vraiment être utile, mais std::deque peut être une bonne solution.

    En fonction du nombre d'appels de la fonction de tri et de la taille de la liste, std::set, qui maintient ses éléments triés, peut également être intéressant.
    std::set si tes clés sont déjà contenus dans tes objets, std::map si tu veux spécifier toi même les clés!

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

Discussions similaires

  1. Etablir une liste dans une feuille selon un critère de date
    Par orpheus111 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/09/2011, 21h05
  2. Réponses: 18
    Dernier message: 09/12/2010, 20h40
  3. Activer une ligne de zone de liste selon un critère
    Par dut-dut dans le forum VBA Access
    Réponses: 3
    Dernier message: 30/07/2008, 14h11
  4. Réponses: 5
    Dernier message: 28/08/2006, 18h11
  5. Trie d'une liste d'array
    Par noOneIsInnocent dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 06/01/2006, 12h05

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