Sužinokite, kaip lambdas gali padaryti jūsų kodą efektyvesnį ir lengviau prižiūrimą.
Programavimo kalbos nuolat tobulėja, net tokios, kaip C++, kurios įsitvirtino jau seniai. Jie papildo standartines bibliotekas ir atlieka kitus pakeitimus, kad palengvintų programuotojų, dirbančių dinamiškoje srityje, darbą.
Vykdydamas kalbos evoliuciją, C++ pridėjo lambda išraiškų palaikymą 2011 m. leidime.
Kas tiksliai yra lambda išraiška ir kaip ją panaudoti kaip C++ programuotoją?
Kas yra Lambda išraiška?
Lambda išraiška taip pat žinoma kaip lambda funkcija. Tai įterptinė išraiška su galimybe priimti argumentus, atlikti operacijas ir grąžinti reikšmę, kaip tipiška funkcija.
Galite naudoti lambda kitos funkcijos viduje ir priskirti ją kintamajam. Lamba funkcijos yra praktiškas būdas programoje apibrėžti anoniminį funkcijos objektą. Beveik visos kalbos palaiko lambdas, nors kiekvienas diegimas skiriasi nuo kitų.
Kokios yra C++ Lambda išraiškos dalys?
Lambda išraiškas lengva naudoti C++. Galite suskaidyti lambda išraiškos sintaksę C++ taip:
[capture_clause](parameters) options { expression_body; }
Pavyzdžiui:
tarpt val = 13;
automatinis sumPlusVal = [val](tarpt a, tarpt b) kintamasneišskyrus ->tarpt { grąžinti val + a + b; };
sumPlusVal(2, 5); // 20
Šis kodas deklaruoja sumPlusVal kintamasis automatinis, nes lambda išraiška gali priimti ir grąžinti bet kokį duomenų tipą. Dėl to kompiliatorius nustato tipą kompiliavimo metu.
Iš aukščiau pateikto kodo matote, kad lambda išraišką sudaro kelios dalys, nurodančios, kaip ji veikia. Štai trumpa kiekvieno iš šių komponentų apžvalga.
-
Užfiksavimo sąlyga: Tai pirmoji lambda išraiškos dalis, kurioje galite nurodyti jau esamus kintamuosius arba apibrėžti naujus, kuriuos naudosite išraiškos turinyje. Yra įvairių būdų, kaip nurodyti fiksavimus, pavyzdžiui:
auto addTwo = [foo](){ grąžinti foo + 2; }; // pagal vertę
auto addThree = [&bar](){ grąžinti baras + 3; }; // pagal nuorodą
auto addAllVal = [=](){ grąžinti foo + baras; }; // visi pagal vertę
auto addAllRef = [&](){ grąžinti foo + baras; }; // viskas pagal nuorodą// sukurti kintamąjį fiksavimo sąlygoje
auto createVarInCapture = [fooBar = foo + bar](){ grąžinti fooBar * 5; };// nėra fiksavimo – pateikia klaidą, nes foo nepasiekiamas
auto errorExpression = [](){ grąžinti foo + 2; }; - Parametrai: Ši lambda išraiškos dalis taip pat neprivaloma. Jame yra funkcijų parametrai, kurių reikia lambda. Tai niekuo nesiskiria nuo įprasto būdo, kaip apibrėžti funkcijų parametrus C++.
-
Galimybės: Apibrėždami lambda išraišką taip pat galite nurodyti parinktis. Kai kurios parinktys, kurias galite naudoti: kintamas, išimtis (pvz neišskyrus pirmame pavyzdiniame kode), ->grįžimo_tipas (pvz -> tarpt), reikalauja, atributaiir kt. The kintamas parinktis dažnai naudojama, nes ji leidžia fiksavimus keisti lambda viduje. Žemiau pateiktas kodas tai parodo.
Nors kitos parinktys naudojamos retai, daugiau informacijos apie jas galite rasti adresu cppreference.com puslapis apie lambdas.tarpt vertė = 10;
// grąžina klaidą – reikšmė yra const išraiškos viduje
automatinis mažinimas = [vertė](){ grąžinti --vertė; };
automatinis padidėjimas = [vertė]() kintamas { grąžinti ++vertė; };
padidėjimas (); // 11 - Išraiškos kūnas: Tai yra lambda išraiškos turinys, kuris vykdo ir grąžina reikšmę, panašiai kaip funkcija. Jei reikia, galite padalyti lambda išraiškos turinį daugiau nei vienoje eilutėje. Tačiau geriausia būtų jį pateikti kuo trumpiau, kad būtų išvengta netvarkingo kodo.
Kokie yra lambda išraiškų pranašumai?
Lambda funkcijų naudojimas kode turi daug privalumų. Be didesnio kūrimo greičio ir efektyvumo, didžiausi lambdas pranašumai yra šie:
- Lambda išraiškos padeda išlaikyti kodą švarų. Vienas iš geriausių būdų, kaip padaryti kodą paprastą ir tvarkingą, yra naudoti lambdas, kur įmanoma. Tai gali būti labai naudinga palaikant skaitomą ir pakartotinai naudojamą kodo struktūrą.
-
Galite perduoti lambdas kitoms funkcijoms kaip parametrus. The C++ standartinė bibliotekastd:: sort() metodas išnaudoja šią naudą. Galite perduoti lambda kaip vieną iš šio metodo parametrų, kad nurodytumėte, kaip funkcija turi atlikti rūšiavimą. Pavyzdžiui:
std:: vektorius<tarpt> arr = {2, 5, 1, 3, 4};
std:: rūšiuoti (arr.begin(), arr.end(), [](tarpt a, tarpt b){ grąžinti a < b; });
// arr = {1, 2, 3, 4, 5} -
Lambdos yra daugkartinio naudojimo. Kartais gali tekti kodo bloką pakartotinai naudoti programos funkcijoje, neapibrėžiant naujos funkcijos. Tokiais atvejais lambdos gali labai padėti. Apsvarstykite šį daugkartinio naudojimo lambda išraiškos pavyzdį:
Ši programa duoda tokį rezultatą: Šis pavyzdys parodo, kaip paprasta apibrėžti lambda, kad galėtumėte ją naudoti su bet kokio tipo.#įtraukti <iostream>
naudojant vardų erdvėstd;tarptpagrindinis(){
// apibrėžkite daugkartinio naudojimo lambda
auto addUp = [](automatinis a, automatinis b, automatinis c) noexcept {
cout <<"Dabar pridedama... "<< a <<", "<< b <<" ir "<< c << endl;
grąžinti a + b + c ;
};cout << sudėjimas (22, 33, 44) << endl;
cout << addUp (string("laimingas "), eilutė ("Gimdymas"), eilutė ("dieną")) << endl;
cout << addUp(tiesa, klaidinga, tiesa) << std:: endl; // vykdomas kaip skaičiai (1 ir 0)
}
Lambdas naudojimas C++
Yra daug kitų pranašumų, kuriuos siūlo lambda išraiškos, ir jūs sužinosite, kaip jūsų programos struktūra tampa sudėtingesnė. Tiesą sakant, C ++ programuotojai kartais vadina lambda išraiškas kaip uždarymus, nes tai yra puikus būdas įgyvendinti uždarymą kode.
Turėtumėte apsvarstyti lambda išraiškas, jei norite įtraukti modernias C++ sąvokas į savo kodų bazę.