Lambda izteiksme C++ valodā
C++ 11 ieviesa lambda izteiksmes, lai atļautu iekļautas funkcijas, kuras var izmantot īsiem koda fragmentiem, kuri netiks izmantoti atkārtoti un tāpēc nav nepieciešams nosaukums. Vienkāršākajā formā lambda izteiksmi var definēt šādi:
[ capture clause ] (parameters) ->return-type {metodes definīcija} Parasti atgriešanās veidu lambda izteiksmēs novērtē pats kompilators, un mums tas nav skaidri jānorāda. Arī -> return tipa daļu var ignorēt. Tomēr dažos sarežģītos gadījumos, piem. nosacījuma priekšrakstiem, kompilators nevar noteikt atgriešanas veidu, un ir nepieciešama skaidra specifikācija.
Tālāk ir norādīti dažādi lambda izteiksmes lietojumi ar standarta funkcijām:
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> >{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> >:: iterators 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) ->>> > < < 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;> }> |
Izvade:
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
Lambda izteiksmei var būt lielāka jauda nekā parastajai funkcijai, jo tai ir piekļuve mainīgajiem lielumiem no aptverošā tvēruma. Mēs varam tvert ārējos mainīgos no aptverošā tvēruma trīs veidos:
Uzņemt ar atsauci
Tvert pēc vērtības
Uzņemt ar abiem (jaukta tveršana)
Sintakse, ko izmanto mainīgo tveršanai:
[&] : tver visus ārējos mainīgos ar atsauci
[=] : tver visus ārējos mainīgos pēc vērtības
[a, &b]: tver a pēc vērtības un b ar atsauci
Lambda ar tukšu uztveršanas klauzulu [ ] var piekļūt tikai tiem mainīgajiem, kas tai ir lokāli.
Tālāk ir parādītas dažādas uztveršanas metodes:
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> >:: iterators 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;> }> |
Izvade:
First number greater than 5 is : 7 The number of elements greater than or equal to 5 is : 3
Piezīme: Lambda izteiksmes ir pieejamas pēc C++ 11.