C++ 11 pristatė lambda išraiškas, kad būtų galima naudoti eilutines funkcijas, kurios gali būti naudojamos trumpiems kodo fragmentams, kurie nebus naudojami pakartotinai ir todėl jiems nereikia pavadinimo. Paprasčiausia lambda išraiška gali būti apibrėžta taip:
tvarka atsitiktine tvarka sql
[ capture clause ] (parameters) ->return-type {metodo apibrėžimas}> Paprastai grąžinimo tipą lambda išraiškose įvertina pats kompiliatorius ir mums nereikia jo aiškiai nurodyti. Taip pat galima nepaisyti -> return tipo dalies. Tačiau kai kuriais sudėtingais atvejais, pvz. sąlyginius teiginius, kompiliatorius negali nustatyti grąžinimo tipo ir reikalinga aiški specifikacija.
Toliau pateikiami įvairūs lambda išraiškos su standartinėmis funkcijomis naudojimo būdai:
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>>:: iteratorius 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) ->>>{> >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;> }> |
>
>
Išvestis:
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 išraiška gali turėti daugiau galios nei įprasta funkcija, turėdama prieigą prie kintamųjų iš uždarosios apimties. Mes galime užfiksuoti išorinius kintamuosius iš apimančios apimties trimis būdais:
Užfiksuoti pagal nuorodą
Užfiksuoti pagal vertę
Užfiksuokite abu (mišrus fiksavimas)
Kintamiesiems užfiksuoti naudojama sintaksė:
[&] : fiksuoja visus išorinius kintamuosius pagal nuorodą
[=] : užfiksuoti visus išorinius kintamuosius pagal vertę
[a, &b] : užfiksuoti a pagal reikšmę ir b pagal nuorodą
Lambda su tuščia fiksavimo sąlyga [ ] gali pasiekti tik vietinius kintamuosius.
Toliau pateikiami įvairūs fiksavimo būdai:
linux make komandą
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>>:: iteratorius 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;> }> |
java galiojantys identifikatoriai
>
>
Išvestis:
First number greater than 5 is : 7 The number of elements greater than or equal to 5 is : 3>
Pastaba: Lambda išraiškos pasiekiamos po C++ 11.