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 :

Tri Alphabetique d'un vector de pointeurs vers objets


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Par défaut Tri Alphabetique d'un vector de pointeurs vers objets
    Bonjour,

    Je suis entrain de finaliser mon application et j'aurai jamais cru qu'une fonction de tri allait me donner autant de mal.

    Je voudrais pouvoir trier mes objets mais je n'arrive pas a trouver la bonne solution.

    Voici l'un de mes objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Classe
    {
        protected:
     
            static unsigned long compteur; //adding a counter
            static unsigned long vivants; //how many objetcts alive
            unsigned long idClasse;
            Texte *Race; (chaine de caractères)
            Texte *PersoClasse; (chaine de caractères)
     
        protected: // function members
            void Allocate(void);
    toutes les autres fonctions...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void setRace (const char *aRace);
    char* getRace (char * abuf, unsigned int bufsize);
    Texte& getRace (Texte& aRace);
    et les autres get et set...

    Lorsque je crée une nouvelle Classe ou que je lit mon fichier j'utilise la fonction
    AddPtr qui se trouve dans mon ContPtr.cpp :
    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
     
    template <typename ENTITY>
    ENTITY* ContPtr<ENTITY>::AddPtr (ENTITY* const ptr)
    {
        if (!ptr) return 0; // no data
        if (FindPtr(ptr)) return 0; // already there
        if (!idOwner) idOwner=this; // no master yet,
        // I become the master!
        vptr.push_back(ptr);
        iter = vptr.end()-1;
     
       if (!isOwner()) idOwner->AddPtr(ptr);
        // if I'm not the master
        // I ask the master to also store this address
        return(*iter);
    }
    Le vptr c'est mon vector il est declaré dans le ContPtr.h comme suis :
    vector<ENTITY *> vptr;

    J'ai ajouté une fonction de tri dans mon ContPtr.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <typename ENTITY>
    void ContPtr<ENTITY> :: Tri (void)
    {
        std :: sort (vptr.begin(), vptr.end(), ??);
    
    }
    et je voudrais l'appeler dans mes applic.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Applic<Classe, FormClasse>::Sort(void)
    {
        cnt.Tri(); //cnt est une variable de type ContPtr, chaque applic a la sienne
        List();
    }
    Mais je ne sais pas comment créer ma fonction de tri en sachant que pour ma class Classe je voudrai trier les objets par rapport aux donnés qui se trouvent dans la variable Race.

    Le fait est que mon vecteur ne contient que des pointeurs vers mes objets
    donc comment lui dire qu'il va faire son tri par rapport a une telle ou telle variable contenue dans l'objet et de type chaine de caractères?

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut


    Il suffit de lui passer le bon foncteur (ici une lambda C++11, mais bien sûr une fonction classique marcherait tout autant) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // retourne true si left est "inférieur" à right
    // cf http://en.cppreference.com/w/cpp/algorithm/sort
    auto comparator_lt = [] (const Race* left, const Race* right) {
      return *left < *right; // ou quelque soit la méthode de comparaison d'objets Race
    }
    std::sort (vptr.begin(), vptr.end(), comparator_lt);

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Par défaut
    Ça serai bien si je pouvais faire ainsi mais ça va pas être possible.

    Race est une variable (et non un objet) de type Texte (tableau de chaine de caractères avec une allocation dynamique géré par ma classe Texte)
    Elle fait partie de mon objet Classe.

    Et ensuite surtout j'aurai du expliquer une chose :
    Je n'ai pas l’accès aux variables de mes objets dans mon ContPtr.cpp
    car je ne sais pas à l'avance quel objet je vais stocker (Une Classe, une Guilde, un Joueur etc...)

    et je n'ai pas l’accès à mon vector vptr depuis mes applic ou j'appelle
    ma fonction de Tri.

    Donc je pensait à quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename ENTITY>
    void ContPtr<ENTITY>:: Tri (char *a, char * b)
    {
     
    	std::sort (vptr.begin(), vptr.end(), comparator_lt(a,b));
    }
     
    auto comparator_lt = [] (const char* left, const char* right) 
    {
    	return *left < *right; 
    };
    et dans mon applic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Applic<Classe, FormClasse>::Sort(void)
    {
    	Classe vtrav;
    	char cbuf [50];
     
    	cnt.Tri(vtrav.getRace(cbuf,50),vtrav.getRace(cbuf,50));
    	List();
    }
    error C2064: le terme ne correspond pas à une fonction qui prend 2 arguments

    Voila suis coincée j'ai essayé d'autres manières mais rien a faire...

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 4
    Par défaut
    J'ai finit par faire une fonction entièrement moi même et ça marche très bien.
    Mais si quelqu'un trouve une solution avec std :: sort ça m’intéresse de la voir^^

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Donnes nous le code de ta fonction de tri, et on va essayer.
    Enfin, moi, je vais le faire

    N'oublie pas d'utiliser [code].

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    je ne vois vraiment pas où se situe le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Str { int a; };
    bool Compare(const Str& _left, const Str& _right) { return _left.a < _right.a; }
    Str s1, s2;
    s1.a = 5;
    s2.a = 1;
    std::vector<Str> vec;
    vec.push_back(s1);
    vec.push_back(s2);
    std::sort(vec.begin(), vec.end(), Compare);
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. vector d'objets ou vector de pointeurs sur objets
    Par manitor dans le forum Débuter
    Réponses: 7
    Dernier message: 16/02/2012, 21h41
  2. Réponses: 11
    Dernier message: 17/05/2010, 10h40
  3. Passage de tableau de pointeurs vers objets
    Par gnulix dans le forum C++
    Réponses: 5
    Dernier message: 14/04/2007, 19h41
  4. Réponses: 4
    Dernier message: 04/02/2007, 00h06

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