Lær hvordan lambdaer kan gjøre koden din mer effektiv og enklere å vedlikeholde.
Programmeringsspråk utvikler seg kontinuerlig, selv de som C++ som etablerte seg for lenge siden. De legger til funksjoner til standardbiblioteker og gjør andre endringer for å lette jobben for programmerere som jobber i et dynamisk felt.
Som en del av oppdateringene forårsaket av språkets utvikling, la C++ til støtte for lambda-uttrykk i 2011-utgivelsen.
Hva er egentlig et lambda-uttrykk, og hvordan kan du bruke det til din fordel som C++-programmerer?
Hva er et Lambda-uttrykk?
Et lambda-uttrykk er også kjent som en lambda-funksjon. Det er et innebygd uttrykk med evnen til å akseptere argumenter, utføre operasjoner og returnere en verdi, akkurat som en typisk funksjon.
Du kan bruke en lambda inne i en annen funksjon og tilordne den til en variabel. Lamba-funksjoner er en praktisk måte å definere et anonymt funksjonsobjekt i et program. Nesten alle språk støtter lambdaer, selv om hver implementering varierer fra de andre.
Hva er delene av et C++ Lambda-uttrykk?
Lambda-uttrykk er enkle å bruke i C++. Du kan bryte ned syntaksen til et lambda-uttrykk i C++ som følger:
[capture_clause](parametere) alternativer { expression_body; }
For eksempel:
int val = 13;
auto sumPlusVal = [val](int en, int b) foranderligikke unntatt ->int { komme tilbake val + a + b; };
sumPlusVal(2, 5); // 20
Denne koden erklærer sumPlusVal variabel auto fordi et lambda-uttrykk kan akseptere og returnere alle datatyper. Dette lar det være opp til kompilatoren å bestemme typen under kompilering.
Fra koden ovenfor kan du se at et lambda-uttrykk inneholder flere deler som spesifiserer hvordan det fungerer. Her er en rask oversikt over hver av disse komponentene.
-
Capture-klausul: Dette er den første delen av et lambda-uttrykk der du kan spesifisere eksisterende variabler eller definere nye som skal brukes i uttrykkskroppen. Det er forskjellige måter å spesifisere fangst, for eksempel:
auto addTwo = [foo](){ komme tilbake foo + 2; }; // etter verdi
auto addThree = [&bar](){ komme tilbake bar + 3; }; // ved referanse
auto addAllVal = [=](){ komme tilbake foo + bar; }; // alt etter verdi
auto addAllRef = [&](){ komme tilbake foo + bar; }; // alt ved referanse// lag en variabel i capture-leddet
auto createVarInCapture = [fooBar = foo + bar](){ komme tilbake fooBar * 5; };// no capture - returnerer feil fordi foo ikke er tilgjengelig
auto errorExpression = [](){ komme tilbake foo + 2; }; - Parametere: Denne delen av lambda-uttrykket er også valgfritt. Den inneholder funksjonsparametrene som kreves av lambdaen. Dette er ikke forskjellig fra den vanlige måten du definerer funksjonsparametere i C++.
-
Alternativer: Du kan også angi alternativer når du definerer et lambda-uttrykk. Noen alternativer du kan bruke er: foranderlig, unntak (f.eks ikke unntatt i den første prøvekoden), ->returtype (f.eks ->int), krever, egenskaper, etc. De foranderlig alternativet brukes ofte fordi det gjør at fangst kan endres inne i lambdaen. Koden nedenfor viser dette.
Selv om de andre alternativene sjelden brukes, kan du få mer informasjon om dem på cppreference.com side på lambdaer.int verdi = 10;
// returnerer en feil - verdi er en konstant inne i uttrykket
automatisk dekrement = [verdi](){ komme tilbake --verdi; };
automatisk økning = [verdi]() mutable { komme tilbake ++verdi; };
inkrement(); // 11 - Uttrykkskropp: Dette er lambda-uttrykkets kropp som kjører og returnerer en verdi, omtrent som en funksjon ville gjort. Om nødvendig kan du dele kroppen til et lambda-uttrykk over mer enn én linje. Det er imidlertid best praksis å holde det så kort som mulig for å forhindre uorganisert kode.
Hva er fordelene med Lambda-uttrykk?
Det er mange fordeler med å bruke lambda-funksjoner i koden din. Bortsett fra økt utviklingshastighet og effektivitet, er de beste fordelene du får fra lambdaer som følger:
- Lambda-uttrykk bidrar til å holde koden ren. En av de beste måtene å holde koden din enkel og ryddig er å bruke lambdaer der det er mulig. Dette kan være svært nyttig for å opprettholde en lesbar og gjenbrukbar kodestruktur.
-
Du kan sende lambdaer til andre funksjoner som parametere. De C++ standardbibliotekerstd:: sort() metoden gjør bruk av denne fordelen. Du kan sende en lambda som en av denne metodens parametere for å spesifisere hvordan funksjonen skal utføre sorteringen. For eksempel:
std:: vektor<int> arr = {2, 5, 1, 3, 4};
std:: sort (arr.begin(), arr.end(), [](int en, int b){ komme tilbake a < b; });
// arr = {1, 2, 3, 4, 5} -
Lambdaer er gjenbrukbare. Noen ganger vil du kanskje gjøre en kodeblokk gjenbrukbar innenfor rammen av en funksjon i programmet uten å måtte definere en ny funksjon. Lambda kan være til stor hjelp i slike tilfeller. Tenk på følgende eksempel på et gjenbrukbart lambda-uttrykk:
Dette programmet gir følgende resultat: Dette eksemplet viser hvor enkelt det er å definere en lambda slik at du kan bruke den med hvilken som helst type.#inkludere <iostream>
ved hjelp av navneområdestd;inthoved-(){
// definer en gjenbrukbar lambda
auto addUp = [](auto a, auto b, auto c) noexcept {
cout <<"Legger nå sammen... "<< en <<", "<< b <<" og "<< c << endl;
komme tilbake a + b + c;
};cout << addUp (22, 33, 44) << endl;
cout << addUp (streng("Lykkelig "), streng("Fødsel"), streng("dag")) << endl;
cout << addUp(ekte, falsk, ekte) << std:: endl; // utføres som tall (1 og 0)
}
Bruker lambdaer i C++
Det er mange andre fordeler som lambda-uttrykk tilbyr, og du vil oppdage dem etter hvert som strukturen til programmet ditt blir mer komplekst. Faktisk refererer C++-programmerere noen ganger til lambda-uttrykk som lukkinger fordi de er en så fin måte å implementere lukkinger i kode.
Du bør vurdere lambda-uttrykk hvis du vil inkorporere moderne C++-konsepter i kodebasen din.