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 :

std: transform or for_each


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    Points : 25
    Points
    25
    Par défaut std: transform or for_each
    Bonjour !

    Bonne année à tous et merci d'avance pour les nombreuses questions que je vais vous poser cette année !

    Je souhaite modifier les valeurs d'un vecteur de double en appliquant la même fonction à chacun des éléments

    j'ai le choix entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    transform(vecteur.begin(),vecteur.end(), vecteur.begin(), fVal);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for_each(vecteur.begin(),vecteur.end(), vecteur.begin(), fRef);
    où fRef est passée par référence

    Quel est le plus naturel? Et surtout le plus rapide?

    Merci

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    for_each mais sans ref.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Goten Voir le message
    for_each mais sans ref.
    Je crois que tu as répondu un peu vite

    Pour transformer les valeurs, for_each n'est pas l'idéal - transform est peut être plus explicite ; sans compter que la sémantique du foncteur passé est définie comme une transformation (x = f(y) sur chaque valeur du conteneur, contre f(y) pour for_each).

    Du coup, modifier les valeurs d'un conteneur via for_each nécessite le passage par référence non constante des données du conteneur au foncteur.

    (j'utilise le terme foncteur par fainéantise ; c'est un callable, donc soit un foncteur, soit une fonction libre, soit une fonction statique de classe).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Je crois que tu as répondu un peu vite
    je suis d'accord

    en tous les cas, les 2 possibilités que j'ai évoqué marche, je trouvais
    aussi transform plus naturel mais je me demandais en termes de perf
    si c'est la même chose, parce que transform doit faire les assignments
    en plus donc for_each "paraît" plus rapide.

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Je crois que tu as répondu un peu vite

    Pour transformer les valeurs, for_each n'est pas l'idéal - transform est peut être plus explicite ; sans compter que la sémantique du foncteur passé est définie comme une transformation (x = f(y) sur chaque valeur du conteneur, contre f(y) pour for_each).

    Du coup, modifier les valeurs d'un conteneur via for_each nécessite le passage par référence non constante des données du conteneur au foncteur.

    (j'utilise le terme foncteur par fainéantise ; c'est un callable, donc soit un foncteur, soit une fonction libre, soit une fonction statique de classe).
    Non je maintiens, il parlait de passer le foncteur (callable) par ref, aucun intérêt...

    et perso écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct fonc
    {
        void operator()(int& i)
        {
    	i = 42;
        }
    };
     
    std::for_each(range(v), fonc());
    me gêne pas... et je trouve ça plus clair qu'un transform, habitude des lambda je suppose ? (mais je t'accorde que c'est une question de goût). Fin, mon point est que je réagissais au passage par ref, le reste c'est du bikeshed color...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 54
    Points : 25
    Points
    25
    Par défaut
    oui tu as raison je me suis mal exprimé, je parlais de l'argument
    pour le passage par réf

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Goten Voir le message
    Non je maintiens, il parlait de passer le foncteur (callable) par ref, aucun intérêt...

    et perso écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct fonc
    {
        void operator()(int& i)
        {
    	i = 42;
        }
    };
     
    std::for_each(range(v), fonc());
    me gêne pas... et je trouve ça plus clair qu'un transform, habitude des lambda je suppose ? (mais je t'accorde que c'est une question de goût). Fin, mon point est que je réagissais au passage par ref, le reste c'est du bikeshed color...
    Je me suis bien douté que tu réagissait à la lettre, et pas à l'esprit

    je suis d'accord

    en tous les cas, les 2 possibilités que j'ai évoqué marche, je trouvais
    aussi transform plus naturel mais je me demandais en termes de perf
    si c'est la même chose, parce que transform doit faire les assignments
    en plus donc for_each "paraît" plus rapide.
    Si tu espère changer la valeur passée en référence du foncteur sans lui assigner quoi que ce soit, tu risques fort de ne pas trouver de solution à ton problème

    la complexité algorithmique est la même ; à moins que tu ne modifie qu'un seul membre d'une structure ou d'une classe complexe, tu auras un résultat similaire voir identique dans les deux cas. Il est vrai que si tu utilises des objets lourds, une recopie lors de l'assignement final peut poser des problèmes de performance.

    J'en profite pour dire que les lambdas sont disponibles sur VC++ 2010 et sur g++ 4.5, donc ça peut être une bonne chose de les utiliser. Et là, le problème de sémantique de for_each et transform disparait puisque le code devient évident.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/02/2010, 10h42
  2. std::map avec for_each comment acceder à la clef?
    Par Krishna dans le forum SL & STL
    Réponses: 2
    Dernier message: 01/10/2008, 23h16
  3. [STL] for_each et transform
    Par yan dans le forum SL & STL
    Réponses: 29
    Dernier message: 03/08/2007, 01h20
  4. [STL][algorithm]for_each vs transform
    Par r0d dans le forum SL & STL
    Réponses: 6
    Dernier message: 25/07/2007, 12h52
  5. Réponses: 14
    Dernier message: 16/05/2006, 12h26

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