Lær hvordan lambdaer kan gøre din kode mere effektiv og nemmere at vedligeholde.
Programmeringssprog udvikler sig konstant, selv dem som C++, der etablerede sig for længe siden. De tilføjer funktioner til standardbiblioteker og foretager andre ændringer for at lette arbejdet for programmører, der arbejder i et dynamisk felt.
Som en del af opdateringerne forårsaget af sprogets udvikling, tilføjede C++ understøttelse af lambda-udtryk i sin 2011-udgivelse.
Hvad er et lambda-udtryk helt præcist, og hvordan kan du bruge det til din fordel som C++-programmør?
Hvad er et Lambda-udtryk?
Et lambda-udtryk er også kendt som en lambda-funktion. Det er et inline udtryk med evnen til at acceptere argumenter, udføre operationer og returnere en værdi, ligesom en typisk funktion.
Du kan bruge en lambda i en anden funktion og tildele den til en variabel. Lamba-funktioner er en praktisk måde at definere et anonymt funktionsobjekt i et program. Næsten alle sprog understøtter lambdas, selvom hver implementering varierer fra de andre.
Hvad er delene af et C++ Lambda-udtryk?
Lambda-udtryk er nemme at bruge i C++. Du kan nedbryde syntaksen for et lambda-udtryk i C++ som følger:
[capture_clause](parametre) muligheder { expression_body; }
For eksempel:
int val = 13;
auto sumPlusVal = [val](int en, int b) foranderlignej undtagen ->int { Vend tilbage val + a + b; };
sumPlusVal(2, 5); // 20
Denne kode erklærer sumPlusVal variabel auto, fordi et lambda-udtryk kan acceptere og returnere enhver datatype. Dette overlader det til compileren at bestemme typen under kompileringen.
Fra koden ovenfor kan du se, at et lambda-udtryk indeholder flere dele, der angiver, hvordan det fungerer. Her er et hurtigt overblik over hver af disse komponenter.
-
Capture-klausul: Dette er den første del af et lambda-udtryk, hvor du kan angive allerede eksisterende variabler eller definere nye til brug i udtrykkets krop. Der er forskellige måder at angive optagelser på, for eksempel:
auto addTwo = [foo](){ Vend tilbage foo + 2; }; // efter værdi
auto addThree = [&bar](){ Vend tilbage bar + 3; }; // ved reference
auto addAllVal = [=](){ Vend tilbage foo + bar; }; // alt efter værdi
auto addAllRef = [&](){ Vend tilbage foo + bar; }; // alt ved reference// opret en variabel i capture-sætning
auto createVarInCapture = [fooBar = foo + bar](){ Vend tilbage fooBar * 5; };// ingen capture - returnerer fejl, fordi foo ikke er tilgængelig
auto errorExpression = [](){ Vend tilbage foo + 2; }; - Parametre: Denne del af lambda-udtrykket er også valgfri. Den indeholder de funktionsparametre, der kræves af lambda. Dette er ikke anderledes end den sædvanlige måde, du ville definere funktionsparametre i C++.
-
Muligheder: Du kan også angive indstillinger, når du definerer et lambda-udtryk. Nogle muligheder du kan bruge er: foranderlig, undtagelse (for eksempel nej undtagen i den første prøvekode), ->returtype (for eksempel ->int), kræver, egenskaber, etc. Det foranderlig option bruges ofte, fordi den tillader, at optagelser kan ændres inde i lambdaen. Koden nedenfor viser dette.
Selvom de andre muligheder sjældent bruges, kan du få mere information om dem på cppreference.com side om lambdaer.int værdi = 10;
// returnerer en fejl - værdi er en const inde i udtrykket
automatisk dekrement = [værdi](){ Vend tilbage --værdi; };
automatisk stigning = [værdi]() kan ændres { Vend tilbage ++værdi; };
stigning(); // 11 - Udtrykslegeme: Dette er lambda-udtrykkets krop, som udfører og returnerer en værdi, ligesom en funktion ville. Hvis det er nødvendigt, kan du dele brødteksten af et lambda-udtryk over mere end én linje. Det er dog bedste praksis at holde det så kort som muligt for at forhindre uorganiseret kode.
Hvad er fordelene ved Lambda-udtryk?
Der er mange fordele ved at bruge lambda-funktioner i din kode. Bortset fra øget udviklingshastighed og effektivitet, er de største fordele, du modtager fra lambdaer, som følger:
- Lambda-udtryk hjælper med at holde koden ren. En af de bedste måder at holde din kode enkel og pæn er ved at bruge lambdas, hvor det er muligt. Dette kan være meget nyttigt til at opretholde en læsbar og genbrugelig kodestruktur.
-
Du kan overføre lambdaer til andre funktioner som parametre. Det C++ standardbibliotekerstd:: sort() metode gør brug af denne fordel. Du kan sende en lambda som en af denne metodes parametre for at specificere, hvordan funktionen skal udføre sorteringen. For eksempel:
std:: vektor<int> arr = {2, 5, 1, 3, 4};
std:: sort (arr.begin(), arr.end(), [](int en, int b){ Vend tilbage a < b; });
// arr = {1, 2, 3, 4, 5} -
Lambdaer kan genbruges. Nogle gange vil du måske gøre en kodeblok genanvendelig inden for rammerne af en funktion i dit program uden at skulle definere en ny funktion. Lambdas kan være meget nyttige i sådanne tilfælde. Overvej følgende eksempel på et genanvendeligt lambda-udtryk:
Dette program giver følgende resultat: Dette eksempel viser, hvor nemt det er at definere en lambda, så du kan bruge den med enhver type.#omfatte <iostream>
ved brug af navneområdestd;intvigtigste(){
// definere en genanvendelig lambda
auto addUp = [](auto a, auto b, auto c) noexcept {
cout <<"Tilføjer nu... "<< -en <<", "<< b <<" og "<< c << endl;
Vend tilbage a + b + c;
};cout << addUp (22, 33, 44) << endl;
cout << addUp (streng("Lykkelig "), streng("Fødsel"), streng("dag")) << endl;
cout << addUp(rigtigt, falsk, rigtigt) << std:: endl; // udføres som tal (1 og 0)
}
Brug af lambdaer i C++
Der er mange andre fordele, som lambda-udtryk tilbyder, og du vil opdage dem, efterhånden som dit programs struktur bliver mere kompleks. Faktisk refererer C++-programmører nogle gange til lambda-udtryk som lukninger, fordi de er så fantastisk en måde at implementere lukninger i kode.
Du bør overveje lambda-udtryk, hvis du ønsker at inkorporere moderne C++-koncepter i din kodebase.