Opi kuinka lambdat voivat tehdä koodistasi tehokkaamman ja helpommin ylläpidettävän.
Ohjelmointikielet kehittyvät jatkuvasti, myös C++:n kaltaiset, jotka ovat vakiintuneet jo kauan sitten. Ne lisäävät toimintoja vakiokirjastoihin ja tekevät muita muutoksia helpottaakseen dynaamisella alalla työskentelevien ohjelmoijien työtä.
Osana kielen kehityksen tuomia päivityksiä C++ lisäsi tuen lambda-lausekkeille vuoden 2011 julkaisussaan.
Mikä lambda-lauseke tarkalleen ottaen on, ja kuinka voit käyttää sitä hyödyksesi C++-ohjelmoijana?
Mikä on lambda-ilmaisu?
Lambda-lauseke tunnetaan myös lambda-funktiona. Se on sisäinen lauseke, joka voi hyväksyä argumentteja, suorittaa toimintoja ja palauttaa arvon, aivan kuten tyypillinen toiminto.
Voit käyttää lambdaa toisen funktion sisällä ja liittää sen muuttujaan. Lamba-funktiot ovat käytännöllinen tapa määritellä anonyymi funktioobjekti ohjelmassa. Lähes kaikki kielet tukevat lambda-kieliä, vaikka jokainen toteutus eroaa muista.
Mitkä ovat C++-lambda-lausekkeen osat?
Lambda-lausekkeita on helppo käyttää C++:ssa. Voit jakaa lambda-lausekkeen syntaksin C++:ssa seuraavasti:
[capture_clause](parameters) option { lauseke_body; }
Esimerkiksi:
int val = 13;
auto sumPlusVal = [arvo](int a, int b) vaihtelevaei paitsi ->int { palata val + a + b; };
sumPlusVal(2, 5); // 20
Tämä koodi ilmoittaa sumPlusVal muuttuja auto, koska lambda-lauseke voi hyväksyä ja palauttaa minkä tahansa tietotyypin. Tämä jättää kääntäjän tehtäväksi määrittää tyypin kääntämisen aikana.
Yllä olevasta koodista näet, että lambda-lauseke sisältää useita osia, jotka määrittävät sen toiminnan. Tässä on nopea yleiskatsaus jokaisesta näistä komponenteista.
-
Capture-lauseke: Tämä on lambda-lausekkeen ensimmäinen osa, jossa voit määrittää jo olemassa olevia muuttujia tai uusia käytettäväksi lausekkeen rungossa. Kaappauksia voi määrittää eri tavoin, esimerkiksi:
auto addTwo = [foo](){ palata foo + 2; }; // arvon mukaan
auto addThree = [&bar](){ palata baari + 3; }; // viittaamalla
auto addAllVal = [=](){ palata foo + baari; }; // kaikki arvon mukaan
auto addAllRef = [&](){ palata foo + baari; }; // kaikki viitteellä// luo muuttujan sieppauslauseeseen
auto createVarInCapture = [fooBar = foo + bar](){ palata fooBar * 5; };// ei sieppausta - palauttaa virheen, koska foo ei ole käytettävissä
auto errorExpression = [](){ palata foo + 2; }; - Parametrit: Tämä lambda-lausekkeen osa on myös valinnainen. Se sisältää lambdan vaatimat toimintoparametrit. Tämä ei eroa tavallisesta tavasta, jolla määrität funktioparametrit C++:ssa.
-
Vaihtoehdot: Voit myös määrittää valinnat määritettäessä lambda-lauseketta. Joitakin vaihtoehtoja, joita voit käyttää, ovat: vaihteleva, poikkeus (esim ei paitsi ensimmäisessä mallikoodissa), ->palautustyyppi (esim -> int), vaatii, attribuutteja, jne. The vaihteleva Vaihtoehtoa käytetään usein, koska sen avulla kaappauksia voidaan muokata lambdan sisällä. Alla oleva koodi osoittaa tämän.
Vaikka muita vaihtoehtoja käytetään harvoin, voit saada lisätietoja niistä osoitteessa cppreference.com sivu lambdassa.int arvo = 10;
// palauttaa virheen - arvo on lausekkeen sisällä oleva const
automaattinen vähennys = [arvo](){ palata --arvo; };
automaattinen lisäys = [arvo]() muuttuva { palata ++arvo; };
lisäys(); // 11 - Ilmaisun runko: Tämä on lambda-lausekkeen runko, joka suorittaa ja palauttaa arvon, aivan kuten funktio tekisi. Tarvittaessa voit jakaa lambda-lausekkeen rungon useammalle kuin yhdelle riville. Paras käytäntö on kuitenkin pitää se mahdollisimman lyhyenä koodin epäjärjestyksen estämiseksi.
Mitkä ovat lambda-ilmaisujen edut?
Lambda-funktioiden käyttämisessä koodissasi on monia etuja. Paremman kehitysnopeuden ja tehokkuuden lisäksi lambdasta saamasi tärkeimmät edut ovat seuraavat:
- Lambda-lausekkeet auttavat pitämään koodin puhtaana. Yksi parhaista tavoista pitää koodisi yksinkertaisena ja siistinä on käyttää lambdaa mahdollisuuksien mukaan. Tämä voi olla erittäin hyödyllistä luettavan ja uudelleenkäytettävän koodirakenteen ylläpitämisessä.
-
Voit siirtää lambdat muille funktioille parametreina. The C++-standardikirjastotstd:: sort() menetelmä hyödyntää tätä etua. Voit antaa lambdan yhdeksi tämän menetelmän parametreista määrittääksesi, kuinka funktion tulee suorittaa lajittelu. Esimerkiksi:
std:: vektori<int> arr = {2, 5, 1, 3, 4};
std:: sort (arr.begin(), arr.end(), [](int a, int b){ palata a < b; });
// arr = {1, 2, 3, 4, 5} -
Lambdat ovat uudelleenkäytettäviä. Joskus saatat haluta tehdä koodilohkon uudelleen käytettäväksi ohjelmasi funktion puitteissa ilman, että sinun tarvitsee määrittää uutta funktiota. Lambdat voivat olla erittäin hyödyllisiä tällaisissa tapauksissa. Harkitse seuraavaa esimerkkiä uudelleen käytettävästä lambda-lausekkeesta:
Tämä ohjelma tuottaa seuraavan tuloksen: Tämä esimerkki osoittaa, kuinka helppoa on määrittää lambda, jotta voit käyttää sitä minkä tahansa tyypin kanssa.#sisältää <iostream>
käyttämällä nimiavaruusstd;intpää(){
// määrittele uudelleen käytettävä lambda
auto addUp = [](auto a, auto b, auto c) ei paitsi {
cout <<"Nyt summataan... "<< a <<", "<< b <<" ja "<< c << endl;
palata a + b + c;
};cout << summa (22, 33, 44) << endl;
cout << addUp (string("Onnellinen "), merkkijono("Syntymä"), merkkijono("päivä")) << endl;
cout << addUp(totta, väärä, totta) << std:: endl; // suoritetaan numeroina (1 ja 0)
}
Lambdan käyttö C++:ssa
Lambda-lausekkeet tarjoavat monia muita etuja, ja huomaat ne, kun ohjelmasi rakenne muuttuu monimutkaisemmaksi. Itse asiassa C++-ohjelmoijat kutsuvat joskus lambda-lausekkeita sulkemisiksi, koska ne ovat niin loistava tapa toteuttaa sulkemisia koodissa.
Sinun tulee harkita lambda-lausekkeita, jos haluat sisällyttää nykyaikaiset C++-konseptit koodikantaasi.