logo

Lambdauttryck i C++

C++ 11 introducerade lambda-uttryck för att tillåta inline-funktioner som kan användas för korta kodavsnitt som inte kommer att återanvändas och därför inte kräver ett namn. I sin enklaste form kan ett lambda-uttryck definieras enligt följande:

packa upp i linux
  [ capture clause ] (parameters) ->returtyp { definition av metod }>

I allmänhet utvärderas returtypen i lambda-uttryck av kompilatorn själv och vi behöver inte specificera den explicit. Även delen -> returtyp kan ignoreras. Men i vissa komplexa fall t.ex. villkorliga uttalanden kan kompilatorn inte bestämma returtypen och explicit specifikation krävs.
Olika användningar av lambda-uttryck med standardfunktioner ges nedan:



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



>

>

byta java-programmering

Produktion:

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>

Ett lambdauttryck kan ha mer kraft än en vanlig funktion genom att ha tillgång till variabler från det omslutande scopet. Vi kan fånga externa variabler från det omslutande omfånget på tre sätt:
Fånga genom referens
Fånga efter värde
Fånga av båda (blandad fångst)
Syntax som används för att fånga variabler:
[&] : fånga alla externa variabler genom referens
[=] : fånga alla externa variabler efter värde
[a, &b] : fånga a efter värde och b genom referens
En lambda med en tom capture-sats [ ] kan bara komma åt variabler som är lokala för den.
Olika metoder för att fånga visas nedan:

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

>

>

strängar i c

Produktion:

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

Obs: Lambda-uttryck är tillgängliga efter C++ 11.