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 :

mem_fun et for_each


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut mem_fun et for_each
    Bonjour,

    Je viens de passer pas mal de temps à essayer d'utiliser mem_fun dans un for_each et je n'y arrive pas.

    J'ai la classe suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Component {
      public:
        PutListIn( vector<ElementBase*> elts )  // Ajoute des éléments 
                                                // de la classe dans elts.
    }
    J'ai les vecteurs suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      vector<Component*> cpts;
      vector<ElementBase*> elts;  // Qui n'est pas vide
    Maintenant, j'aimerais executer PutListIn() sur les élements de cpts avec le paramètre elts.

    J'ai tenté des syntaxes du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      for_each(cpts.begin(), cpts.end(), 
         std::bind2nd( std:mem_fun( &Component::PutListIn ), elts ) );
    Mais ça ne marche pas.

    Pourriez vous m'aider?

    Merci d'avance.
    Emmanuel Perrin

  2. #2
    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
    Salut.

    qu'es ce que veut faire avec cette algo??

    http://r0d.developpez.com/articles/algos-stl/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    J'aimerais bien appliquer PutListIn( elts ) à tous les éléments de cpts avec for_each.

  4. #4
    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
    Je vien de comprendre.
    Je ne sait pas trop si c'est possible comme cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std:mem_fun( &Component::PutListIn )
    créé un foncteur qui va appliquer la méthode sur l'élément. Seulement ce foncteur ne prend qu'un paramètre et non deux.
    A mon avis, il te faut faire un foncteur :
    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
    18
     
    struct myFoncteur
    {
        myFoncteur(vector<ElementBase*> &elts)
       :m_elts(elts)
       {}
     
       void operator() (Component * comp)
      {
           comp->PutListIn(m_elts);
      }
       vector<ElementBase*> &m_elts
    };
     
     
    [...]
     
    for_each(cpts.begin(), cpts.end(), myFoncteur(elts));
    Si PutListIn ne modifie pas elts, autant le passer en reference, et peut être ajouter des const

  5. #5
    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 Mongaulois Voir le message
    Je vien de comprendre.
    Je ne sait pas trop si c'est possible comme cela.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std:mem_fun( &Component::PutListIn )
    créé un foncteur qui va appliquer la méthode sur l'élément. Seulement ce foncteur ne prend qu'un paramètre et non deux.
    Non, il y a le pointeur this en plus, donc 2 éléments.
    Par contre je vois pas pourquoi ça marche pas de manière immédiate. Soit c'est une limite de la SL qu'il faudrait combler avec Boost.Bind.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    J'aimerais justement éviter de devoir créer un foncteur à chaque fois que je fais un for_each

  7. #7
    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 HanLee Voir le message
    Non, il y a le pointeur this en plus, donc 2 éléments.
    Par contre je vois pas pourquoi ça marche pas de manière immédiate.
    le pointeur this???? quel pointeur this????
    http://www.sgi.com/tech/stl/mem_fun_t.html

  8. #8
    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 Mongaulois Voir le message
    le pointeur this???? quel pointeur this????
    http://www.sgi.com/tech/stl/mem_fun_t.html
    Ah en fait je me suis trompé. std::mem_fun prend une fonction membre qui ne prend aucun paramètre.

    Ben oui le pointeur this !
    Une fonction membre de N variables est équivalente à une fonction libre de N+1 variables, l'objet sur lequel la fonction membre s'applique.

    Tu vois bien leur exemple, que le seul premier paramètre du foncteur retourné par std::mem_fun c'est un pointeur vers B*, c'est le pointeur this.

    ----

    Il faut que tu utilises std::mem_fun1 en fait!

Discussions similaires

  1. for_each / copy / ostream_iterator / mem_fun
    Par Feriaman dans le forum SL & STL
    Réponses: 11
    Dernier message: 25/10/2007, 16h02
  2. [Debutant][STL] For_each instance
    Par Mucho dans le forum SL & STL
    Réponses: 2
    Dernier message: 17/03/2006, 16h29
  3. Problème for_each et foncteur personnel
    Par Alp dans le forum C++
    Réponses: 3
    Dernier message: 16/02/2006, 21h00
  4. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  5. std::mem_fun
    Par tut dans le forum SL & STL
    Réponses: 4
    Dernier message: 04/11/2004, 11h58

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