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 un tableau de classe selon l'un de ses champs (char *)


Sujet :

C++

  1. #21
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Ben nan, le monsieur il a dit qu'il pouvait pas changer les char*…

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ahh c'est beau un code tout propre prêt à l'emploi pour le Posteur...

  3. #23
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Bonjour,

    Merci à tous; je vais regarder ça.

  4. #24
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Bon, et bien c'est nickel.
    Non seulement ça me sert mais ça servira aux autres qui tomberont sur ce post (y compris la "bonne méthode" C++ de koala01 qui ne me sert pas ici mais qui est mieux quand on part de rien).

    par contre:

    1°/ je m'interroge sur les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool operator()(const  Cmyclass& t1, const Cmyclass& t2)
    error C2662: : cannot convert 'this' pointer from 'const class Cmyclass' to 'class Cmyclass &'

    Donc j'ai retiré les "const" et ça marche mais j'aurais bien aimé comprendre.

    2°/Pour aller plus loin : j'ai 2 tableaux à trier quasiment de la même façon sauf qu'ils ne sont pas de la même classe.
    Alors bêtement (?) j'ai dupliqué la fonction test()

    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
    struct test_1
    {
    	bool operator()(Cmyclass1& t1, Cmyclass1& t2)
    	{ 
    ...
    	}
    };
     
    struct test_2
    {
    	bool operator()(Cmyclass2& t1, Cmyclass2& t2)
    	{ 
    ...
    	}
    };
    Y a-t-il une façon plus intelligente ?

  5. #25
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Utilise un template de fonction !

    @tous> D'ailleurs, pourquoi lui avoir fait utiliser un foncteur plutôt qu'une fonction ?

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Parce que les algos générique de la STL font appel à l'opérateur ()...
    Si tu veux utiliser un conteneur (map, list) avec un critère personnalisé, tu vas devoir écrire un foncteur...
    D'ailleurs, un foncteur est par définition une classe avec l'operator () défini!

    EDIT : au fait, le const sert à indiquer au compilo que tu ne modifie pas la valeur. Quand ce n'est pas le cas, il ne faut pas en mettre...

  7. #27
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    @tous> D'ailleurs, pourquoi lui avoir fait utiliser un foncteur plutôt qu'une fonction ?
    De ce que j'ai compris,
    le foncteur aide les compilateurs à mieux optimiser le code généré .

    Mais je ne l'affirme pas et ce n'est peut être plus vrai de nos jours.

  8. #28
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par poukill Voir le message
    Parce que les algos générique de la STL font appel à l'opérateur ()...
    Si tu veux utiliser un conteneur (map, list) avec un critère personnalisé, tu vas devoir écrire un foncteur...
    D'ailleurs, un foncteur est par définition une classe avec l'operator () défini!
    Non, les algo génériques de la STL ont besoin d'une variable d'un type qui permet d'utiliser l'opérateur ().
    Ainsi les fonctions conviennent très bien.

    Par contre, avec les conteneurs prenant un critère personnalisé, comme il faut préciser le type, ce n'est pas forcément plus simple d'utiliser une fonction libre (le type d'une fonction libre c'est plus technique à écrire).
    Autant dans ce cas là utiliser un foncteur.

  9. #29
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par poukill Voir le message
    EDIT : au fait, le const sert à indiquer au compilo que tu ne modifie pas la valeur. Quand ce n'est pas le cas, il ne faut pas en mettre...
    Ben là je ne modifie rien pourtant (je compare); c'est le compilateur qui n'est pas content.

    Citation Envoyé par poukill Voir le message
    Parce que les algos générique de la STL font appel à l'opérateur ()...
    (...)
    Un foncteur est par définition une classe avec l'operator () défini!
    Hum, faut que je vois ces histoires de foncteur (pour passer quelque part un argument qui identifie la classe)

  10. #30
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par stof Voir le message
    Hum, faut que je vois ces histoires de foncteur (pour passer quelque part un argument qui identifie la classe)
    Le « quelque part » sera le constructeur de la classe test !
    Enfin… si ça identifie la classe et pas l'objet, ce serait plutôt un paramètre template.

  11. #31
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    OK (sauf que je connaissais les classes et constructeurs mais j'ai découvert cette façon d'utiliser une structure comme une classe).

    Reste la raison pour laquelle les const ne sont pas passés à la compilation mais bon, peu importe puisque ça compile quand je les enlève.

  12. #32
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Ce serait tout de même intéressant que tu saches pourquoi !

    À mon avis, ça vient du fait que tu accèdes directement au champ name de ta classe.
    Il faudrait que tu écrives un accesseur (== getter) pour cette variable, et qui aurait cette tête là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const char* const get_name() const
    {
        return name;
    }
    Si tu ne comprends pas ce code, n'hésite pas à demander.

  13. #33
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    En fait voilà en gros ce qui est fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct test                                                                                     
    {                                                                                                          
    	bool operator()(/*const*/ Cmyclass& t1, /*const*/ Cmyclass& t2)   {                                         
     
    	return strcmp(t1.getNom().getChaine(), t2.getNom().getChaine()) < 0;
    }
    }
    où le type renvoyé par getNom() est du CMyChaine et la fonction getChaine() va renvoyer un type char* (j'avais éluder ça pour simplifier ma question)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* CMyChaine ::getChaine(void)const
    {
    	return *_chaine;
    }
    Donc tout est bien fait via accesseurs; où est le problème?

  14. #34
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Le mieux serait que tu nous montres le message d'erreur.

    Passer par des accesseurs ne suffit pas. Il faut aussi que ceux-ci soient const. Cmyclass::getNom() l'est-il ?

  15. #35
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMyChaine getNom() {return _nom;}
    Enfin c'était juste pour votre information; je crois que je comprend d'après ce que tu dis qu'il faudrait que toutes les sous-fonctions appelées à chaque fois soient en const.

    Ce qui n'est pas le cas de getNom().

    Merci.

  16. #36
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Enfin, pour que du code soit correct et "safe", il ne suffit pas que les fonctions soient const, mais il faut aussi qu'elles soient const-correctes : Ta fonction getChaine doit renvoyer un const char *.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Algo - Trier un tableau d'objets selon 2 critères
    Par identifiant_bidon dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 08/07/2013, 11h51
  2. 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
  3. comment trier les instances d'une classe selon un attribut choisi
    Par rddev dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 29/05/2007, 00h01
  4. Réponses: 5
    Dernier message: 02/04/2007, 17h49
  5. Trier un tableau de plusieurs type de classes.
    Par storm_2000 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 14/01/2007, 15h50

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