Ismerje meg, hogyan tehetik a lambdák hatékonyabbá és könnyebben karbantarthatóvá a kódot.
A programozási nyelvek folyamatosan fejlődnek, még azok is, mint például a C++, amelyek már régen beváltak. Funkciókkal egészítik ki a szabványos könyvtárakat, és egyéb változtatásokat hajtanak végre, hogy megkönnyítsék a dinamikus területen dolgozó programozók munkáját.
A nyelv fejlődése miatti frissítések részeként a C++ 2011-es kiadásában hozzáadta a lambda-kifejezések támogatását.
Mi is az a lambda kifejezés, és hogyan használhatod fel C++ programozóként?
Mi az a lambda kifejezés?
A lambda-kifejezést lambda-függvénynek is nevezik. Ez egy soron belüli kifejezés, amely képes argumentumokat elfogadni, műveleteket végrehajtani és értéket visszaadni, akárcsak tipikus funkció.
Használhat lambdát egy másik függvényen belül, és hozzárendelheti egy változóhoz. A Lamba függvények egy névtelen függvényobjektum egy programban való definiálásának praktikus módja. Szinte minden nyelv támogatja a lambdákat, bár mindegyik megvalósítás különbözik a többitől.
Mik a részei a C++ lambda kifejezésnek?
A lambda kifejezések könnyen használhatók C++ nyelven. A lambda-kifejezés szintaxisát a következőképpen bonthatja fel C++ nyelven:
[capture_clause](parameters) options { expression_body; }
Például:
int val = 13;
auto sumPlusVal = [érték](int a, int b) változékonynem, kivéve ->int { Visszatérés val + a + b; };
sumPlusVal(2, 5); // 20
Ez a kód deklarálja a sumPlusVal változó auto, mert a lambda kifejezés bármilyen adattípust képes elfogadni és visszaadni. Ez a fordító feladata a fordítás során a típus meghatározása.
A fenti kódból láthatja, hogy egy lambda-kifejezés több olyan részt tartalmaz, amelyek meghatározzák a működését. Íme egy gyors áttekintés ezekről az összetevőkről.
-
Capture záradék: Ez a lambda kifejezés első része, ahol megadhat már meglévő változókat, vagy meghatározhat újakat a kifejezés törzsében. A rögzítések megadásának különböző módjai vannak, például:
auto addTwo = [foo](){ Visszatérés foo + 2; }; // érték szerint
auto addThree = [&sáv](){ Visszatérés bár + 3; }; // referencia alapján
auto addAllVal = [=](){ Visszatérés foo + bár; }; // mind érték szerint
auto addAllRef = [&](){ Visszatérés foo + bár; }; // mindez hivatkozással// hozzon létre egy változót a rögzítési záradékban
auto createVarInCapture = [fooBar = foo + bar](){ Visszatérés fooBar * 5; };// nincs rögzítés - hibát ad vissza, mert a foo nem érhető el
auto errorExpression = [](){ Visszatérés foo + 2; }; - Paraméterek: A lambda kifejezésnek ez a része szintén nem kötelező. Tartalmazza a lambda által igényelt funkcióparamétereket. Ez semmiben sem különbözik a függvényparaméterek C++-ban való szokásos meghatározásától.
-
Lehetőségek: A lambda-kifejezés definiálásakor is megadhat beállításokat. Néhány lehetőség, amelyet használhat: változékony, kivétel (például nem, kivéve az első mintakódban), ->visszatérési_típus (például ->int), igényel, attribútumokstb. Az változékony opciót gyakran használják, mert lehetővé teszi a rögzítések módosítását a lambdán belül. Az alábbi kód ezt mutatja be.
Bár a többi lehetőséget ritkán használják, további információkat kaphat róluk a cppreference.com oldal a lambdákon.int érték = 10;
// hibát ad vissza - az érték egy const a kifejezésben
automatikus csökkentés = [érték](){ Visszatérés --érték; };
auto increment = [érték]() mutable { Visszatérés ++érték; };
növekedés(); // 11 - Kifejezési test: Ez a lambda kifejezés törzse, amely végrehajt és visszaad egy értéket, hasonlóan egy függvényhez. Ha szükséges, a lambda-kifejezés törzsét egynél több sorra is feloszthatja. Mindazonáltal a legjobb gyakorlat, ha a lehető legrövidebbre írja, hogy elkerülje a rendszerezetlen kódot.
Milyen előnyei vannak a lambda-kifejezéseknek?
Számos előnye van a lambda függvények kódjában való használatának. A megnövekedett fejlesztési sebesség és hatékonyság mellett a lambdák által nyújtott legfontosabb előnyök a következők:
- A lambda-kifejezések segítenek tisztán tartani a kódot. A kód egyszerű és rendezett megőrzésének egyik legjobb módja a lambda használata, ahol lehetséges. Ez nagyon hasznos lehet az olvasható és újrafelhasználható kódstruktúra fenntartásában.
-
A lambdákat paraméterként átadhatja más függvényeknek. Az C++ szabványos könyvtárakstd:: sort() módszer kihasználja ezt az előnyt. Ennek a metódusnak az egyik paramétereként átadhat egy lambdát annak meghatározásához, hogy a függvény hogyan hajtsa végre a rendezést. Például:
std:: vektor<int> arr = {2, 5, 1, 3, 4};
std:: sort (arr.begin(), arr.end(), [](int a, int b){ Visszatérés a < b; });
// arr = {1, 2, 3, 4, 5} -
A lambdák újrafelhasználhatók. Néha előfordulhat, hogy egy kódblokkot újra felhasználhatóvá kell tenni egy függvény hatókörében a programban anélkül, hogy új függvényt kellene meghatározni. A lambdák nagyon hasznosak lehetnek ilyen esetekben. Tekintsük a következő példát egy újrafelhasználható lambda kifejezésre:
Ez a program a következő eredményt produkálja: Ez a példa bemutatja, milyen egyszerű a lambda meghatározása, így bármilyen típussal használható.#beleértve <iostream>
segítségével névtérstd;intfő-(){
// újrafelhasználható lambda meghatározása
auto addUp = [](auto a, auto b, auto c) noexcept {
cout <<"Most összeadjuk... "<< a <<", "<< b <<" és "<< c << endl;
Visszatérés a + b + c;
};cout << összeadás (22, 33, 44) << endl;
cout << addUp (string("Boldog "), húr("Születés"), húr("nap")) << endl;
cout << addUp(igaz, hamis, igaz) << std:: endl; // számként (1 és 0) hajtódik végre
}
Lambda használata C++ nyelven
A lambda-kifejezések számos egyéb előnyt is kínálnak, amelyeket a program szerkezetének bonyolultabbá válásával fedezhet fel. Valójában a C++ programozók a lambda-kifejezéseket néha lezárásoknak nevezik, mert nagyszerű módja a lezárások kódbeli megvalósításának.
Fontolja meg a lambda kifejezéseket, ha modern C++ fogalmakat szeretne beépíteni a kódbázisába.