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

SL & STL C++ Discussion :

list::sort() et paramètre supplémentaire


Sujet :

SL & STL C++

Vue hybride

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 33
    Par défaut list::sort() et paramètre supplémentaire
    Bonjour à tous.

    Tout d'abord merci de vous intéresser à mon problème.
    Le fait est que j'ai besoin de trier une liste en fournissant ma propre règle de comparaison. Jusqu'ici pas de problème.

    Le problème vient du fait que j'ai besoin d'un autre paramètre "map" pour comparer 2 éléments de ma liste.

    Ma question est donc:
    Existe-t-il un moyen pour passer ce paramètre autrement qu'en le mettant en variable globale.
    L'idéal serait quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bool compare_fct(MyObject o1, MyObject o2, Map map) {
        return (map(o1) > map(o2));
    }
     
    int main() {
    list<MyObject> l;
     
    l.sort(compare_fct(map));
    }

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Tu pourrais faire un foncteur qui est configurable avec un map, c'est à dire qui a en attribut une map (ou une référence/pointeur sur une map, à toi de voir), et qui l'utilise pour faire la comparaison.

    Si tu peux utiliser le C++1x, tu peux utiliser une expression lambda.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 33
    Par défaut
    Merci de ta réponse.

    Je suis totalement étranger aux foncteurs et ça m'a l'air bien intéressant.

    Si je comprends bien,
    Toute classe surchargeant l'opérateur d'appel de fonction operator()
    Et d'après ce lien

    Il faudrait que je fasse une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class SortWithMyComparator {
           private:
                Map *map;
           public: 
                 bool operator ()(MyObject o1, MyObject o2);
    }
     
    bool SortWithMyComparator:: operator ()(MyObject o1, MyObject o2) {
            return this.map(o1) > this.map(o2);
    }
    et pour finir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::sort(l.begin(), l.end(), SortWithMyCompartor());
    J'ai bon ? Ou je suis complètement à coté.

    Merci pour ton indication en tout caS.

    EDIT:
    Aye non en fait, ma map il faut peut-être que je lui donne à un moment.
    Quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SortWithMyCompartor mySorter(map);
     
    td::sort(l.begin(), l.end(), mySorter());
    plutôt

  4. #4
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Il y a qqchose que je ne comprends pas.
    Que représente map exactement ?
    Dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool compare_fct(MyObject o1, MyObject o2, Map map) {
    map ressemble à un object dont le type serait la classe ou la struct "Map", pourtant juste après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (map(o1) > map(o2));
    map semble être ici une fonction !?
    Je comprendrais si justement map était une fonction-object (foncteur) mais tu dis toi-même dans le post suivant que tu ne connaissais pas la notion de fonction-object !?
    Alors qu'est map en réalité ?
    Edit : Un pointeur de fonction peut être ?

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    C'est preque ca, j'ai pas été revoir l'exemple de la FaQ, mais je suppose qu'il montre un foncteur simple sans paramètre, toi tu as un paramètre, il faut donc le donner pour que ton foncteur s'en serve.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template<class KeyMap, class ValueMap, class ListType>
    struct Fonct
    {
       std::map<KeyMap,ValueMap>& m;
       Fonct(std::map<KeyMap,ValueMap>& p) : m(p) {}
       bool operator()(const ListType& lhs, const ListType& rhs) { /*code*/ }
    };
     
    //code
    std::list<ListType> l;
    std::mat<KeyMap,ValueMap> m;
    l.sort( Fonct<KeyMap,ValueMap,ListType>(m) );
    J'ai mis des templates MapType et ListType parce que je ne sais pas quel sont tes types, tu peux les fixer si tu veux, ou garder le template en améliorant un peu (passage par référence constante inutile si les types sont fondamentales, cf spécialisation template, type traits)

    Et avec des lambda (C++1x), ca donne (exemple compilable)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::list<int> l;
    int i = 10;
    l.sort([i](int i1, int i2){return i1 + i < i2;});
    A toi d'adapter

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 33
    Par défaut
    @Arzar
    En fait, j'ai juste mis "map" car pour moi, une map indexe des objets avec d'autres objets, quelque soient leurs type.

    En réalité, dans l'implémentation, il s'agit d'un graphe dans lequel on a besoin de puiser des listes d'adjacence, rien à voir donc. Désolé de t'avoir un peu embrouillé avec ma syntaxe incorrecte.

    @Flob90 :
    D'accord, merci beaucoup pour toutes ces précisions, je m'y attèle et reviendrais mettre le sujet en résolu si tout va bien.
    Merci encore !


    EDIT: (pour le c++1x , je ne sais même pas comment l'utiliser. (g++ -std=c++1x ?)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 33
    Par défaut
    Désolé pour le double post.

    Ca marche parfaitement !
    J'ai appris quelque chose aujourd'hui ça fait plaisir

    Sinon je vais m'intéresser de plus prêt au C++1x, la dernière fois que j'ai vu une fonction lambda c'était en Lisp, c'est tout dire.

    Merci encore, en espérant que ce sujet puisse servir à d'autres.

    Bonne soirée.

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

Discussions similaires

  1. actualiser zone de liste en fonction paramètres
    Par erox44 dans le forum VBA Access
    Réponses: 10
    Dernier message: 25/10/2007, 19h06
  2. [Débutant]Hibernate et listes de types paramétrés
    Par Nico73 dans le forum Hibernate
    Réponses: 2
    Dernier message: 28/11/2006, 18h57
  3. utilisation de list::sort() ?
    Par kitsune dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/11/2006, 12h47
  4. Liste exhaustive des paramètres du fichier .htaccess
    Par Christophe Charron dans le forum Apache
    Réponses: 3
    Dernier message: 09/02/2006, 17h46
  5. Réponses: 3
    Dernier message: 23/01/2006, 11h43

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