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 :

for_each pour remplacer toutes les boucles?


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Points : 95
    Points
    95
    Par défaut for_each pour remplacer toutes les boucles?
    Bonjour à vous tous.

    Dans l'idée d'optimisation d'un programme, pensez vous que de créer notre propre foncteur et utilisé for_each peut accèlérer ce dit programme?
    Ou vaut il mieux rester dans un "for" normal ?

    Merci .

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    Le for_each n'étant certainement rien de plus qu'un for camouflé, y passer aura pour conséquence au mieux de ne rien faire, au pire de perdre en perf avec l'indirection (et éventuels traitements) supplémentaires.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Je me permettrai de faire la distinction entre le for_each et le for automatique de C++11 (for (auto e: liste))
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Points : 95
    Points
    95
    Par défaut
    D'accord merci pour vos réponses ^^.
    Je demandais ça car dans le livre de Bjarne, en conseil il est marquer d'utiliser un for_each plutôt qu'une boucle ^^.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Entre le for_each et le for :
    - Le for_each explicite ce qu'on fait (on sait dès le début qu'on parcours tout le range, sans sauter le moindre élément, en allant jusqu'au bout, alors qu'un simple for, il faut lire le body pour voir ça)
    - Le for_each camoufle l'usage des itérateurs
    - Le for_each garanti que l'itérateur de fin ne sera calculé qu'une fois
    - Si on n'a pas les lambdas, le for_each est totalement illisible
    - Même avec les lambdas, il est moins lisible que certaines alternatives, ne serait-ce que parce que moins habituel

    Avec un compilateur qui les gère, je conseillerais vivement d'utiliser des range based for loops plutôt que des for_each (ou même que des for classiques quand c'est adapté), car ils en ont les avantages sans les inconvénients.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Points : 95
    Points
    95
    Par défaut
    Salut, merci de ta réponse.

    Je n'ai pas compris en quoi avec le for il faut lire le body (c'est à dire le body d'ailleurs?).

    Qu'est ce que sont les lambdas? (Les foncteurs / objet fonction? )

    Qu'est ce qu'un range based for loop ?

    Désolé, je suis un peu débutant en C++ ^^.

    Merci

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    dans la dernière norme, C++11, une nouvelle syntaxe du for a été introduite: le range base for.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vector<int> v;
    // remplissage…
    cout << "v contient";
    for (int element : v) {cout << ' '<<v;}
    cout << endl;
    les lambdas peuvent être vu comme des "foncteurs locaux" la notation est un peu déroutante, que j'aurais du mal a expliquer.
    Voici un exemple de syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main() {
        vector<int> nums{3, 4, 2, 9, 15, 267};
        for_each(nums.begin(), nums.end(), [](int &n){ n++; });
        cout << "chaque nombre de n à bien été multiplié."<<endl;
     
        cout << "noms contient:";
        for_each(nums.begin(), nums.end(), [](int &n){ cout << ' '<<n; });
        cout <<endl;
     
        int somme = 0;
        for_each(nums.begin(), nums.end(), [somme&](int &n){ somme+=n; });
        cout << "total: "<<somme<<endl;
        return 0;
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre régulier
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Points : 95
    Points
    95
    Par défaut
    Un jour, je passerais en C++11.

    Mais pour le moment, je n'utilise que l'ancienne norme, donc bon... ^^.

    Merci de tes explications ^^.

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

Discussions similaires

  1. Stop pour toutes les boucles
    Par malmou dans le forum LabVIEW
    Réponses: 2
    Dernier message: 28/01/2015, 09h37
  2. Boucle pour ouvrir toutes les tables d'un coup
    Par zarbouine dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/01/2011, 15h28
  3. Borland C++ 5.5 remplacer toutes les occurences
    Par cdelamarre dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 30/11/2005, 12h23
  4. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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