Saznajte kako lambda može učiniti vaš kod učinkovitijim i lakšim za održavanje.
Programski jezici neprestano se razvijaju, čak i oni poput C++ koji su se davno etablirali. Oni dodaju funkcije standardnim bibliotekama i čine druge promjene kako bi olakšali posao programera koji rade u dinamičnom polju.
Kao dio ažuriranja do kojih je dovela evolucija jezika, C++ je dodao podršku za lambda izraze u svom izdanju iz 2011.
Što je točno lambda izraz i kako ga možete koristiti u svoju korist kao C++ programer?
Što je lambda izraz?
Lambda izraz je također poznat kao lambda funkcija. To je ugrađeni izraz s mogućnošću prihvaćanja argumenata, izvođenja operacija i vraćanja vrijednosti, baš kao tipična funkcija.
Možete koristiti lambda unutar druge funkcije i dodijeliti je varijabli. Lamba funkcije praktičan su način definiranja anonimnog funkcijskog objekta u programu. Gotovo svaki jezik podržava lambda, iako se svaka implementacija razlikuje od ostalih.
Koji su dijelovi C++ lambda izraza?
Lambda izrazi su jednostavni za korištenje u C++. Možete raščlaniti sintaksu lambda izraza u C++ na sljedeći način:
[klauza_hvatanja](parametri) opcije { tijelo_izraza; }
Na primjer:
int vrijednost = 13;
auto sumPlusVal = [val](int a, int b) promjenjivnoexcept ->int { povratak val + a + b; };
sumPlusVal(2, 5); // 20
Ovaj kod izjavljuje sumPlusVal varijabla auto jer lambda izraz može prihvatiti i vratiti bilo koji tip podataka. Ovo prepušta kompajleru da odredi tip tijekom kompilacije.
Iz gornjeg koda možete vidjeti da lambda izraz sadrži nekoliko dijelova koji određuju kako funkcionira. Evo kratkog pregleda svake od ovih komponenti.
-
Klauzula o hvatanju: Ovo je prvi dio lambda izraza u kojem možete specificirati već postojeće varijable ili definirati nove za korištenje u tijelu izraza. Postoje različiti načini za određivanje snimanja, na primjer:
auto addTwo = [foo](){ povratak foo + 2; }; // po vrijednosti
auto addThree = [&bar](){ povratak bar + 3; }; // referencom
auto addAllVal = [=](){ povratak foo + bar; }; // sve po vrijednosti
auto addAllRef = [&](){ povratak foo + bar; }; // sve prema referencama// kreiraj varijablu u klauzuli za snimanje
auto createVarInCapture = [fooBar = foo + bar](){ povratak FooBar * 5; };// nema snimanja - vraća pogrešku jer foo nije dostupan
auto errorExpression = [](){ povratak foo + 2; }; - Parametri: Ovaj dio lambda izraza također nije obavezan. Sadrži parametre funkcije koje zahtijeva lambda. Ovo se ne razlikuje od uobičajenog načina na koji biste definirali parametre funkcije u C++.
-
Mogućnosti: Također možete navesti opcije prilikom definiranja lambda izraza. Neke opcije koje biste mogli koristiti su: promjenjiv, izuzetak (npr noexcept u prvom uzorku koda), ->return_type (npr ->int), zahtijeva, atributiitd. The promjenjiv opcija se često koristi jer dopušta da se hvatanja mogu mijenjati unutar lambda. Kod u nastavku to pokazuje.
Iako se druge opcije rijetko koriste, više informacija o njima možete dobiti na cppreference.com stranica o lambdama.int vrijednost = 10;
// vraća grešku - vrijednost je konstanta unutar izraza
automatsko smanjenje = [vrijednost](){ povratak --vrijednost; };
auto inkrement = [vrijednost]() promjenjiv { povratak ++vrijednost; };
povećanje(); // 11 - Izrazno tijelo: Ovo je tijelo lambda izraza koje izvršava i vraća vrijednost, slično kao što bi to učinila funkcija. Ako je potrebno, možete podijeliti tijelo lambda izraza u više od jedne linije. Međutim, najbolja je praksa da bude što kraći kako biste spriječili neorganiziran kod.
Koje su prednosti lambda izraza?
Postoje mnoge prednosti korištenja lambda funkcija u vašem kodu. Osim povećane brzine i učinkovitosti razvoja, glavne prednosti koje dobivate od lambda su sljedeće:
- Lambda izrazi pomažu u održavanju čistoće koda. Jedan od najboljih načina da vaš kod bude jednostavan i uredan je korištenje lambda gdje je to moguće. To može biti od velike pomoći u održavanju čitljive strukture koda koja se može ponovno koristiti.
-
Možete proslijediti lambde drugim funkcijama kao parametre. The C++ standardne bibliotekestd:: sort() metoda koristi ovu prednost. Možete proslijediti lambda kao jedan od parametara ove metode da odredite kako bi funkcija trebala izvršiti sortiranje. Na primjer:
std:: vektor<int> arr = {2, 5, 1, 3, 4};
std:: sort (arr.begin(), arr.end(), [](int a, int b){ povratak a < b; });
// arr = {1, 2, 3, 4, 5} -
Lambde su za višekratnu upotrebu. Ponekad ćete možda htjeti napraviti blok koda koji se može ponovno koristiti u okviru funkcije u vašem programu bez definiranja nove funkcije. Lambda može biti od velike pomoći u takvim slučajevima. Razmotrite sljedeći primjer višekratnog lambda izraza:
Ovaj program daje sljedeće rezultate: Ovaj primjer pokazuje kako je jednostavno definirati lambda tako da je možete koristiti s bilo kojom vrstom.#uključi <iostream>
korištenjem imenski prostorstd;intglavni(){
// definirati višekratnu lambdu
auto addUp = [](auto a, auto b, auto c) noexcept {
cout <<"Sada zbrajanje... "<< a <<", "<< b <<" i "<< c << endl;
povratak a + b + c ;
};cout << zbrajanje (22, 33, 44) << endl;
cout << addUp (string("Sretan "), niz("Rođenje"), niz("dan")) << endl;
cout << addUp(pravi, lažno, pravi) << std:: endl; // izvršava se kao brojevi (1 i 0)
}
Korištenje Lambda u C++
Postoje mnoge druge prednosti koje nude lambda izrazi, a otkrit ćete ih kako struktura vašeg programa postaje sve složenija. Zapravo, C++ programeri ponekad nazivaju lambda izraze zatvaranjima jer su tako sjajan način za implementaciju zatvaranja u kodu.
Trebali biste razmotriti lambda izraze ako želite ugraditi moderne C++ koncepte u svoju bazu koda.