C++ 11 a introduit les expressions lambda pour autoriser les fonctions en ligne qui peuvent être utilisées pour de courts extraits de code qui ne seront pas réutilisés et ne nécessitent donc pas de nom. Dans sa forme la plus simple, une expression lambda peut être définie comme suit :
chaîne convertie en int en java
[ capture clause ] (parameters) ->type de retour { définition de la méthode }> Généralement, le type de retour dans les expressions lambda est évalué par le compilateur lui-même et nous n'avons pas besoin de le spécifier explicitement. De plus, la partie -> type de retour peut être ignorée. Cependant, dans certains cas complexes, par ex. instructions conditionnelles, le compilateur ne peut pas déterminer le type de retour et une spécification explicite est requise.
Diverses utilisations de l'expression lambda avec des fonctions standard sont indiquées ci-dessous :
RPC
// C++ program to demonstrate lambda expression in C++> #include> using> namespace> std;> // Function to print vector> void> printVector(vector<>int>>v)> {> >// lambda expression to print vector> >for_each(v.begin(), v.end(), [](>int> i)> >{> >std::cout << i <<>' '>;> >});> >cout << endl;> }> int> main()> {> >vector<>int>>dans {4, 1, 3, 5, 2, 3, 1, 7};> >printVector(v);> >// below snippet find first number greater than 4> >// find_if searches for an element for which> >// function(third argument) returns true> >vector<>int>>:: itérateur p = find_if(v.begin(), v.end(), [](>int> i)> >{> >return> i>4;> >});> >cout <<>'First number greater than 4 is : '> << *p << endl;> >// function to sort vector, lambda expression is for sorting in> >// non-increasing order Compiler can make out return type as> >// bool, but shown here just for explanation> >sort(v.begin(), v.end(), [](>const> int>& a,>const> int>& b) ->>bool> >{> >return> a>b;> >});> >printVector(v);> >// function to count numbers greater than or equal to 5> >int> count_5 = count_if(v.begin(), v.end(), [](>int> a)> >{> >return> (a>= 5);> >});> >cout <<>'The number of elements greater than or equal to 5 is : '> ><< count_5 << endl;> >// function for removing duplicate element (after sorting all> >// duplicate comes together)> >p = unique(v.begin(), v.end(), [](>int> a,>int> b)> >{> >return> a == b;> >});> >// resizing vector to make size equal to total different number> >v.resize(distance(v.begin(), p));> >printVector(v);> >// accumulate function accumulate the container on the basis of> >// function provided as third argument> >int> arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};> >int> f = accumulate(arr, arr + 10, 1, [](>int> i,>int> j)> >{> >return> i * j;> >});> >cout <<>'Factorial of 10 is : '> << f << endl;> >// We can also access function by storing this into variable> >auto> square = [](>int> i)> >{> >return> i * i;> >};> >cout <<>'Square of 5 is : '> << square(5) << endl;> }> |
>
>
Sortir:
4 1 3 5 2 3 1 7 First number greater than 4 is : 5 7 5 4 3 3 2 1 1 The number of elements greater than or equal to 5 is : 2 7 5 4 3 2 1 Factorial of 10 is : 3628800 Square of 5 is : 25>
Une expression lambda peut avoir plus de puissance qu'une fonction ordinaire en ayant accès aux variables de la portée englobante. Nous pouvons capturer les variables externes de la portée englobante de trois manières :
Capture par référence
Capture par valeur
Capture par les deux (capture mixte)
Syntaxe utilisée pour capturer les variables :
[&] : capture toutes les variables externes par référence
[=] : capture toutes les variables externes par valeur
[a, &b] : capture a par valeur et b par référence
Un lambda avec une clause de capture vide [ ] ne peut accéder qu'aux variables qui lui sont locales.
Différentes méthodes de capture sont illustrées ci-dessous :
RPC
arbre binaire vs bst
// C++ program to demonstrate lambda expression in C++> #include> using> namespace> std;> int> main()> {> >vector<>int>>v1 = {3, 1, 7, 9};> >vector<>int>>v2 = {10, 2, 7, 16, 9};> >// access v1 and v2 by reference> >auto> pushinto = [&] (>int> m)> >{> >v1.push_back(m);> >v2.push_back(m);> >};> >// it pushes 20 in both v1 and v2> >pushinto(20);> >// access v1 by copy> >[v1]()> >{> >for> (>auto> p = v1.begin(); p != v1.end(); p++)> >{> >cout << *p <<>' '>;> >}> >};> >int> N = 5;> >// below snippet find first number greater than N> >// [N] denotes, can access only N by value> >vector<>int>>:: itérateur p = find_if(v1.begin(), v1.end(), [N](>int> i)> >{> >return> i>N;> >});> >cout <<>'First number greater than 5 is : '> << *p << endl;> >// function to count numbers greater than or equal to N> >// [=] denotes, can access all variable> >int> count_N = count_if(v1.begin(), v1.end(), [=](>int> a)> >{> >return> (a>= N);> >});> >cout <<>'The number of elements greater than or equal to 5 is : '> ><< count_N << endl;> }> |
>
>
PowerShell inférieur ou égal à
Sortir:
First number greater than 5 is : 7 The number of elements greater than or equal to 5 is : 3>
Remarque : les expressions Lambda sont disponibles après C++ 11.