Naučite se, kako lahko lambda naredi vašo kodo učinkovitejšo in lažjo za vzdrževanje.
Programski jeziki se nenehno razvijajo, tudi tisti, kot je C++, ki so se uveljavili že davno. Standardnim knjižnicam dodajo funkcije in naredijo druge spremembe, da olajšajo delo programerjev, ki delajo na dinamičnem področju.
Kot del posodobitev, ki jih je prinesel razvoj jezika, je C++ v svoji izdaji iz leta 2011 dodal podporo za lambda izraze.
Kaj pravzaprav je lambda izraz in kako ga lahko uporabite v svojo korist kot programer C++?
Kaj je lambda izraz?
Lambda izraz je znan tudi kot lambda funkcija. Je vgrajeni izraz z možnostjo sprejemanja argumentov, izvajanja operacij in vrnitve vrednosti, tako kot tipična funkcija.
Lambdo lahko uporabite znotraj druge funkcije in jo dodelite spremenljivki. Funkcije Lamba so praktičen način definiranja anonimnega funkcijskega objekta v programu. Skoraj vsak jezik podpira lambde, čeprav se vsaka izvedba razlikuje od drugih.
Kateri so deli lambda izraza C++?
Lambda izrazi so enostavni za uporabo v C++. Sintakso lambda izraza v C++ lahko razdelate na naslednji način:
[capture_clause](parametri) možnosti { izraz_body; }
Na primer:
int val = 13;
avto sumPlusVal = [val](int a, int b) spremenljivnoexcept ->int { vrnitev val + a + b; };
sumPlusVal(2, 5); // 20
Ta koda razglaša sumPlusVal spremenljivka auto, ker lahko lambda izraz sprejme in vrne katero koli podatkovno vrsto. To prepušča prevajalniku, da določi vrsto med prevajanjem.
Iz zgornje kode lahko vidite, da lambda izraz vsebuje več delov, ki določajo, kako deluje. Tukaj je kratek pregled vsake od teh komponent.
-
Klavzula o zajemanju: To je prvi del lambda izraza, kjer lahko podate že obstoječe spremenljivke ali definirate nove za uporabo v telesu izraza. Zajeme lahko določite na različne načine, na primer:
auto addTwo = [foo](){ vrnitev foo + 2; }; // po vrednosti
auto addThree = [&bar](){ vrnitev bar + 3; }; // s sklicevanjem
auto addAllVal = [=](){ vrnitev foo + bar; }; // vse po vrednosti
auto addAllRef = [&](){ vrnitev foo + bar; }; // vse po referencah// ustvari spremenljivko v klavzuli o zajemanju
auto createVarInCapture = [fooBar = foo + bar](){ vrnitev fooBar * 5; };// brez zajema - vrne napako, ker foo ni dostopen
auto errorExpression = [](){ vrnitev foo + 2; }; - Parametri: Tudi ta del lambda izraza ni obvezen. Vsebuje parametre funkcije, ki jih zahteva lambda. To se ne razlikuje od običajnega načina definiranja funkcijskih parametrov v C++.
-
Opcije: Možnosti lahko določite tudi pri definiranju lambda izraza. Nekatere možnosti, ki jih lahko uporabite, so: spremenljiv, izjema (npr noexcept v prvi vzorčni kodi), ->return_type (npr ->int), zahteva, lastnostiitd. The spremenljiv možnost se pogosto uporablja, ker omogoča spreminjanje zajemov znotraj lambde. Spodnja koda to prikazuje.
Čeprav se druge možnosti redko uporabljajo, lahko dobite več informacij o njih na cppreference.com stran o lambdah.int vrednost = 10;
// vrne napako - vrednost je konstanta znotraj izraza
samodejni dekrement = [vrednost](){ vrnitev --vrednost; };
samodejni prirast = [vrednost]() spremenljiv { vrnitev ++vrednost; };
povečaj(); // 11 - Izrazno telo: To je telo lambda izraza, ki izvede in vrne vrednost, podobno kot bi to storila funkcija. Če je potrebno, lahko telo lambda izraza razdelite v več kot eno vrstico. Vendar je najboljša praksa, da ostane čim krajša, da preprečite neorganizirano kodo.
Kakšne so prednosti lambda izrazov?
Uporaba lambda funkcij v vaši kodi ima veliko prednosti. Poleg povečane razvojne hitrosti in učinkovitosti so glavne prednosti, ki jih prejmete od lambda, naslednje:
- Lambda izrazi pomagajo ohranjati kodo čisto. Eden najboljših načinov, da ohranite svojo kodo preprosto in čisto, je uporaba lambda, kjer je to mogoče. To je lahko zelo koristno pri ohranjanju berljive in večkrat uporabne strukture kode.
-
Lambde lahko posredujete drugim funkcijam kot parametre. The standardne knjižnice C++std:: sort() metoda izkorišča to prednost. Kot enega od parametrov te metode lahko posredujete lambdo, da določite, kako naj funkcija izvede razvrščanje. Na primer:
std:: vektor<int> arr = {2, 5, 1, 3, 4};
std:: sort (arr.begin(), arr.end(), [](int a, int b){ vrnitev a < b; });
// arr = {1, 2, 3, 4, 5} -
Lambde so za večkratno uporabo. Včasih boste morda želeli narediti blok kode za ponovno uporabo v obsegu funkcije v vašem programu, ne da bi morali definirati novo funkcijo. Lambde so lahko v takih primerih zelo koristne. Razmislite o naslednjem primeru večkratno uporabnega lambda izraza:
Ta program daje naslednje rezultate: Ta primer prikazuje, kako preprosto je definirati lambdo, tako da jo lahko uporabite s katero koli vrsto.#vključi <iostream>
uporabo imenski prostorstd;intglavni(){
// definirajte lambdo za večkratno uporabo
auto addUp = [](auto a, auto b, auto c) noexcept {
cout <<"Zdaj pa seštevam... "<< a <<", "<< b <<" in "<< c << endl;
vrnitev a + b + c ;
};cout << addUp (22, 33, 44) << endl;
cout << addUp (niz("srečno "), vrvica("Rojstvo"), vrvica("dan")) << endl;
cout << addUp(prav, lažno, prav) << std:: endl; // izvaja se kot številke (1 in 0)
}
Uporaba Lambda v C++
Obstaja veliko drugih prednosti, ki jih ponujajo lambda izrazi, in odkrili jih boste, ko bo struktura vašega programa postala bolj zapletena. Pravzaprav programerji C++ včasih označujejo lambda izraze kot zaprtja, ker so tako odličen način za implementacijo zaprtij v kodo.
Razmislite o lambda izrazih, če želite v svojo kodno zbirko vključiti sodobne koncepte C++.