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:
jak zwrócić tablicę w Javie
[ 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
ipconfig na Ubuntu
// 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;> }> |
>
>
koniec pętli Java
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.