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 :

Trier une liste de pointeur de class


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 79
    Points : 45
    Points
    45
    Par défaut Trier une liste de pointeur de class
    j'ai une liste de class Citoyen que j'aimerai trier selon un critère par example leur id

    donc j'ai une liste de Citoyen :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list<unique_ptr<Citoyen>> ListeDePatient;
    je fais quelque insert dans ma list :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ListeDePatient.push_back(unique_ptr<Citoyen>(new Citoyen(3,"bob","2012")));
    	ListeDePatient.push_back(unique_ptr<Citoyen>(new Citoyen(1,"roger","2013")));
    	ListeDePatient.push_back(unique_ptr<Citoyen>(new Citoyen(2,"noob","2011")));
    J'aimerai la trier selon le id, donc je me suis fais une fonction qui retourne le citoyen ayant le plus grand id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool NasGreater(unique_ptr<Citoyen> a, unique_ptr<Citoyen> b)
    {
    	if(a._Myptr->GetNas() == b._Myptr->GetNas())
    		return a._Myptr->GetNas() < b._Myptr->GetNas();
     
    	return a._Myptr->GetNas() > b._Myptr->GetNas();
    }
    et je trie ma liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort(ListeDePatient.begin(),ListeDePatient.end(),NasGreater);
    J'obtient une erreur lors à sort : impossible de déduire l'Argument modèle pour std::move_iterator<_RanIt> ...

    Je comprend pas vraiment l'erreur l'iterator n'est pas capable de parcourir la liste a cause qu'il ne sait pas c'est quoi comme liste ?

  2. #2
    Membre éprouvé

    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
    Points : 1 086
    Points
    1 086
    Par défaut
    Un unique_ptr, comme son nom l'indique, n'existe qu'en un seul exemplaire.
    Or les arguments de NasGreater lui son passés par copie, ce qui est impossible puisque unique_ptr n'offre aucun constructeur par recopie.
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool NasGreater(const unique_ptr<Citoyen>& a, const unique_ptr<Citoyen>& b) {
    }

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    Un petit conseil supplémentaire:

    N'accède jamais à un membre de classe, surtout si son nom commence par un underscore " _ ".

    Le moyen correct d'accéder au pointeur d'un unique_ptr est de passer par la fonction get() qui, n'étant jamais qu'un accesseur inline, aura exactement les mêmes performances que l'accès direct au membre en question.

    Mais, et c'est cela qui est important, tout ce qui est préfixé d'un underscore (comme _MyPtr ) est dépendant de l'implémentation.

    Il se pourrait donc que ce soit _MyPtr sous visual studio et seulement _ptr sous gcc (ou l'inverse) et il se pourrait même que cela change d'une version (par exemple VS2012) à la suivante.

    Ne te demandes pas pourquoi ils décideraient de changer subitement, mais demandes toi plutôt ce qui les empêcherait de le faire, et la réponse est malheureusement "rien ne les empêcherait de le faire"

    Enfin, bref, si tu veux t'éviter bien des soucis et des sueurs froides à chaque fois que tu vas changer de version de compilateur, et, surtout, si tu veux avoir un code qui puisse compiler aussi sur différentes plateformes, évites comme la peste d'utiliser les choses qui dépendent de l'implémentation (tu les reconnaitra parce que le nom commence par _ ou par __ ).

    Te voici averti

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais, et c'est cela qui est important, tout ce qui est préfixé d'un underscore (comme _MyPtr ) est dépendant de l'implémentation.
    Je croyais que ça ne concernait que le double underscore (__) ?

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Citation Envoyé par oodini Voir le message
    Je croyais que ça ne concernait que le double underscore (__) ?
    Ne t'a-t-on donc jamais dit qu'il faut laisser croire le béguines, elles sont spécialistes et payées pour

    Mais bon, plus sérieusement...

    La norme n'as pas l'habitude d'imposer des détails d'implémentation.

    Ce qu'elle impose au niveau de la S(T)L, c'est une interface minimale (libre à l'implémentation de rajouter des éléments, mais il ne peut en aucun cas en retirer).

    Eventuellement, elle proposera une implémentation qui lui semble correcte avec, on s'en doute, certains détails d'implémentation, mais ce sera alors à titre d'exemple.

    Libre à l'implémentation de se contenter d'un copier / coller de l'exemple ou... de faire tout à fait à sa guise, du moment que l'interface minimale est respectée (entre autres, car il y a aussi certaines obligations de complexités sur certaines fonctions, par exemple ).

    La manière dont unique_ptr (parce que c'est l'exemple présenté à l'origine par lolaalol) maintient l'adresse correspondante à l'objet est donc strictement à charge de l'implémentation.

    Elle peut tout aussi bien décider de l'appeler _mptr que _Mptr ou _M_ptr ou que sais-je encore.

    Bref, tu constateras que tu ne peux en aucun cas de fier au nom du membre en question

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 79
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    N'accède jamais à un membre de classe, surtout si son nom commence par un underscore " _ ".
    à c'est bon a savoir, je ne savais pas.

    A propos de la function sort je bloqué, j'image que c'est les paramètres de ma fonction NasGreater qui fuck tout, mais je ne sais pas quoi mettre.

    je sais aussi que je dois utiliser le sort de la liste et non sort de algorithm
    liste.sort(NasGreater);
    et non
    sort(NasGreater);

  7. #7
    Membre éprouvé

    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
    Points : 1 086
    Points
    1 086
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool NasGreater(const unique_ptr<Citoyen>& a, const unique_ptr<Citoyen>& b) {
    }
    Cette modif-là ne fonctionne pas ?

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Il y a en fait 3 probleme:

    1. l'interface ne peut pas marcher parceque tu fais des copies, ce qui a ete pointe auparavant.

    2. tu n'utilises pas l'interface de unique_ptr mais un detail d'implementation, ce qui a ete pointe auparavant.

    3. dans l'appel a sort:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort(ListeDePatient.begin(),ListeDePatient.end(),NasGreater); // ici
    Tu passes un nom de type en troisieme paramettre, pas un objet.
    Ce que tu veux c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort(ListeDePatient.begin(),ListeDePatient.end(), NasGreater() );
    La c'est bien un objet (temporaire, via l'appel du constructeur).

    NOTE: en C++11 on aurait plutot ecrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort( begin(ListeDePatient), end(ListeDePatient), NasGreater{} );
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort( begin(ListeDePatient), end(ListeDePatient), [] /* le code du lambda */ );

    ---- EDIT

    Rectification: ce que je pointais au dessus est vrai uniquement si NasGreater est un type (fonction-objet) ce qui n'est pas le cas ici puisque c'est une fonction (j'avais mal lu, par reflex).

    Dans ce cas tu aurais du donner l'adresse de la fonction, il me semble que Visual Studio accepte directement le nom mais que c'est pas standard donc d'autres compilateurs ne l'accepteronent pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort( begin(ListeDePatient), end(ListeDePatient), &NasGreater );

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 79
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Cette modif-là ne fonctionne pas ?
    Je n'avais pas pu ton premier message

    Citation Envoyé par Klaim Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort( begin(ListeDePatient), end(ListeDePatient), &NasGreater );
    On peut utiliser la fonction sort() de la library algorithm même avec une liste ? il ne vaut pas mieux utiliser la fonction sort() de la STL list ?

  10. #10
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    En effet il y a une exception pour std::list, on ne peut pas utiliser l'algorithme std::sort directement, il faut utiliser à la place la fonction membre std::list::sort

  11. #11
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Ah oui effectivement, un autre probleme qu'on a tous manque

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

Discussions similaires

  1. Trier une liste de classe selon un attribut
    Par pedro570 dans le forum Général Python
    Réponses: 4
    Dernier message: 06/05/2013, 18h04
  2. Réponses: 2
    Dernier message: 08/09/2011, 09h07
  3. Trier une liste de "classes"
    Par rambc dans le forum Général Python
    Réponses: 7
    Dernier message: 08/07/2009, 16h30
  4. trier une liste de pointeurs sur personne
    Par italiasky dans le forum SL & STL
    Réponses: 5
    Dernier message: 10/11/2007, 14h53
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

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