Lambda-uttrykk i C++

C++ 11 introduserte lambda-uttrykk for å tillate innebygde funksjoner som kan brukes for korte kodebiter som ikke skal gjenbrukes og derfor ikke krever et navn. I sin enkleste form kan et lambda-uttrykk defineres som følger:

  [ capture clause ] (parameters) ->retur-type {definisjon av metode } 

Generelt blir returtypen i lambda-uttrykk evaluert av kompilatoren selv, og vi trenger ikke spesifisere den eksplisitt. Også -> return-type delen kan ignoreres. Men i noen komplekse saker, f.eks. betingede setninger, kan ikke kompilatoren bestemme returtypen, og det kreves eksplisitt spesifikasjon.
Ulike bruksområder for lambda-uttrykk med standardfunksjoner er gitt nedenfor:

CPP




// 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> >i {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> >:: iterator 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;> }>

Produksjon:

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 

Et lambda-uttrykk kan ha mer kraft enn en vanlig funksjon ved å ha tilgang til variabler fra det omsluttende omfanget. Vi kan fange eksterne variabler fra det omsluttende omfanget på tre måter:
Fang ved referanse
Fangst etter verdi
Fangst av begge (blandet fangst)
Syntaks brukt for å fange variabler:
[&] : fanger opp alle eksterne variabler ved referanse
[=] : fange opp alle eksterne variabler etter verdi
[a, &b] : fange opp a etter verdi og b ved referanse
En lambda med en tom capture-klausul [ ] kan bare få tilgang til variabler som er lokale for den.
Ulike metoder for fangst er demonstrert nedenfor:

CPP




// 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> >:: iterator 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;> }>

Produksjon:

First number greater than 5 is : 7 The number of elements greater than or equal to 5 is : 3 

Merk: Lambda-uttrykk er tilgjengelige etter C++ 11.