Partage
  • Partager sur Facebook
  • Partager sur Twitter

exemple de lambda avec STL

C++

Sujet résolu
    30 août 2018 à 14:41:32

    Bonjour  OC    :)

    voici un exemple de remplissage de tableaux par valeurs aléatoires que j'écris.

    Je fais appel aux lambdas notamment. Il y a quelque chose que je souhaite comprendre :

    srand(time(0));
        vector<double> a(50,0.);  //3 tableaux de 50 nombres à virgule
        vector<double> b(50,0.);
        vector<double> c(50,0.);
    
        for_each(a.begin(),a.end(),[&](double x){x=((double)rand())/((double)7);});
        for_each(b.begin(),b.end(),[&](double x){x=((double)rand())/((double)7);});
        for_each(c.begin(),c.end(),[&](double x){x=((double)rand())/((double)7);});
        for_each(a.begin(),a.end(),[](double x){cout<<x<<endl;});

    Voici ma question :

    pour le vector 'a' par exemple, quand j'écris '[&](double & x)', mes valeurs sont modifiées et les changements conservées, alors quand je fais

    '[&](double x)'  sans la deuxième esperluette, ce n'est pas le cas. Or je pensais que le [&] suffisait pour dire au code de passer des valeurs par référence.

    Pourquoi les changements ne sont pas conservés alors que l'on indique entre crochets un passage par référence ?

    Cela me fait penser que je n'ai peut-être pas saisi la différence entre ce qu'il y  a entre crochets et ce qu'il y a entre parenthèses.

    Pourriez-vous m'expliquer avec des exemples à l'appui pour bien capter ?

    Merci

    -
    Edité par pseudo-simple 30 août 2018 à 14:46:58

    • Partager sur Facebook
    • Partager sur Twitter
      30 août 2018 à 15:03:32

      Lu',

      ce qu'il y'a entre les crochets permets de "capturer" les éléments environnement par reference. Si tu modifies ces éléments dans ta lambda, les modifications seront conservées. La deuxieme esperluette elle, fonctionne comme pour une fonction "traditionnelle". 

      Quand tu ecris [&](T val), tu passes le std::vector par reference, mais ses elements (qu'il contient) par valeur. Alors que quand tu ecris [&](T &val), tu passes le tableau par reference, ET ses elements par reference.

      Voici un exemple 

      Edit: ajout de l'exemple.

      -
      Edité par eugchriss 30 août 2018 à 15:28:01

      • Partager sur Facebook
      • Partager sur Twitter

      Eug

        30 août 2018 à 17:04:23

        Lu Eugchriss;

        si je comprends bien ton code et exemple, tu veux dire que dans l'exemple que j'ai donné au-dessus, je peux par exemple utiliser les variables d'environnement b et c dans la fonction lambda de

        for_each(a.begin(),a.end(),[&](double x){x=((double)rand())/((double)7);});

        et que b et c seront transmises par référence, alors que x ne correspond pas à une variables d'environnement , mais à ce qui est dans le for_each de a.begin() à a.end() ?



        -
        Edité par pseudo-simple 30 août 2018 à 17:50:05

        • Partager sur Facebook
        • Partager sur Twitter
          30 août 2018 à 17:56:49

          C'est exactement ça. Grace à la capture, tout ce qui est hors de la lambda elle meme peut être vu comme une variable globale dans un programme "classique" (du point de vue de la lambda). Tu as donc le droit d'utiliser tout ce que tu as capturé comme bon te semble.

          La variable 'x' dans ton cas correspond au paramètre dont ta lambda a besoin et non à une variable d'environnement, comme pour une fonction "classique": il n'existe que dans ta lambda. Tu es donc libre de transmettre ce paramètre par reférence ou valeur.

          • Partager sur Facebook
          • Partager sur Twitter

          Eug

            30 août 2018 à 20:41:48

            En application, voici ce que j'ai fait : j'ai incorporé b dans la lambda :

            for_each(a.begin(),a.end(),[&](double x){x=((double)rand())/((double)7);
                                                         cout<<(b.begin())*<<endl;
                                                        });

            J'ai le message d'erreur :

            error: expected primary-expression before '<<' token|

            Pourtant b est bien capturé .

            Quelque chose m'échappe

            EDIT : j'ai trouvé : l'étoile devait être avant

            -
            Edité par pseudo-simple 30 août 2018 à 20:53:19

            • Partager sur Facebook
            • Partager sur Twitter

            exemple de lambda avec STL

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown