Wyrażenie lambda w C++

W C++ 11 wprowadzono wyrażenia lambda, aby umożliwić funkcje wbudowane, których można używać w przypadku krótkich fragmentów kodu, które nie będą ponownie wykorzystywane i dlatego nie wymagają nazwy. W najprostszej formie wyrażenie lambda można zdefiniować w następujący sposób:

  [ capture clause ] (parameters) ->typ zwrotu { definicja metody } 

Ogólnie rzecz biorąc, typ zwracany w wyrażeniach lambda jest oceniany przez sam kompilator i nie musimy go jawnie określać. Można również zignorować część typu -> zwracanego. Jednak w niektórych skomplikowanych przypadkach, np. instrukcji warunkowych kompilator nie może określić typu zwracanego wyniku i wymagana jest jawna specyfikacja.
Poniżej podano różne zastosowania wyrażeń lambda ze standardowymi funkcjami:

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> >w {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;> }>

Wyjście:

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 

Wyrażenie lambda może mieć większe możliwości niż zwykła funkcja dzięki dostępowi do zmiennych z otaczającego zakresu. Zmienne zewnętrzne z otaczającego zakresu możemy przechwytywać na trzy sposoby:
Przechwytywanie przez odniesienie
Przechwytywanie według wartości
Przechwytywanie przez oba (przechwytywanie mieszane)
Składnia używana do przechwytywania zmiennych:
[&] : przechwytuje wszystkie zmienne zewnętrzne przez odniesienie
[=] : przechwytuje wszystkie zmienne zewnętrzne według wartości
[a, &b] : przechwyć a według wartości i b przez odniesienie
Lambda z pustą klauzulą ​​przechwytywania [ ] może uzyskać dostęp tylko do zmiennych, które są dla niej lokalne.
Poniżej przedstawiono różne metody przechwytywania:

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;> }>

Wyjście:

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

Uwaga: Wyrażenia Lambda są dostępne po C++ 11.