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 :

Trier un vecteur de classe en fonction d'un attribut ?


Sujet :

Langage C++

Vue hybride

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 50
    Par défaut [Résolu] Trier un vecteur de classe en fonction d'un attribut ?
    Salut à tous !

    Je suis confronté à un petit souci... J'ai créé un vecteur d'une classe A, et j'ai besoin de classer ce vecteur par l'intermédiaire d'un attribut de cette classe... Et je ne sais pas comment m'y prendre :/


    Voici ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class A
    {
         private
             int  numeroClasse;
             int position;
    }
    je crée un vecteur de cette classe

    Je rentre plusieurs objets de type A dans ce vecteur via les push_back.

    Maintenant je voudrais classer les éléments du vecteur monVecteur via l'attribut "position".

    Donc que les classes soient triées de celle qui a la position la plus petite à celle qui a la position la plus grande...

    J'ai parcouru un peu le std::sort, mais à part faire un sort via les itérateurs monVecteur.begin() et monVecteur.end() je ne sais pas quoi faire d'autre :/

    Merci de votre aide

  2. #2
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Tu as trois solutions :
    - soit tu définis l'opérator < dans la struct A
    - soit tu utilise un foncteur du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct compA {
         bool operator()(const A& a1, const A& a2)
         {
                return (a1.position() < a2.position());
          }
    };
     
    std::sort(vA.begin(), vA.end(), compA());
    ou bien encore avec une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bool compA(const A& a1, const A& a1)
    {
     return (a1.position() < a2.position());
    }
     
    std::sort(vA.begin(), vA.end(), compA);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 50
    Par défaut
    J'ai tenté la version Fonction , j'imagine que position() est l'accesseur qui permet de renvoyer la valeur de "Position"

    J'ai un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Course.cpp:150: error: passing ‘const VoilierEnCourse’ as ‘this’ argument of ‘int VoilierEnCourse::getPositionX()’ discards qualifiers
    Course.cpp:150: error: passing ‘const VoilierEnCourse’ as ‘this’ argument of ‘int VoilierEnCourse::getPositionX()’ discards qualifiers
    make[2]: *** [build/Debug/Cygwin-Windows/Course.o] Error 1
    Ma classe A c'est VoilierEnCourse

    Voici le code de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool comparaisonPosition(const VoilierEnCourse& v1, const VoilierEnCourse& v2)
    {
        return (v1.getPositionX() < v2.getPositionX());
    }

    Et sa décalaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool comparaisonPosition(const VoilierEnCourse& v1, const VoilierEnCourse& v2);

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Il manque un const à la fonction getPositionX() !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 50
    Par défaut
    J'ai bien rajouté le const à la fonction int getPosition(), mais le message persiste :/

    Voilà le code de la classe concernée

    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 VoilierEnCourse: public VoilierInscrit
    {
        private:
            int numVoilierCourse;
            int positionX;
     
     
        public:
            VoilierEnCourse(VoilierInscrit* leVoilier);
            ~VoilierEnCourse();
     
            int setPositionX(int position);
            const int getPositionX();
     
            int affiche();
    };
    Et éventuellement le code de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     const int VoilierEnCourse::getPositionX()
    {
        return this->positionX;
    }

  6. #6
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    mais non, ce qu'il voulait dire c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int VoilierEnCourse::getPositionX() const
    {
        return this->positionX;
    }
    retourner un const int ne sert à rien
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

Discussions similaires

  1. Différencier des classes en fonction d'un attribut
    Par micromich dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 17/02/2010, 17h48
  2. [conception] vecteur de classes
    Par r0d dans le forum C++
    Réponses: 7
    Dernier message: 28/12/2005, 12h00
  3. trier un vecteur de nom?
    Par STRUFIELD dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/12/2005, 08h21
  4. problème classe et fonction
    Par zmatz dans le forum C++
    Réponses: 14
    Dernier message: 19/10/2005, 21h46
  5. Classes - Sub/Fonction vs Property
    Par j_bolduc dans le forum ASP
    Réponses: 6
    Dernier message: 24/08/2005, 19h19

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