Zjistěte, jak může lambda zefektivnit váš kód a snáze jej udržovat.
Programovací jazyky se neustále vyvíjejí, dokonce i ty jako C++, které se prosadily již dávno. Přidávají funkce do standardních knihoven a provádějí další změny pro usnadnění práce programátorů pracujících v dynamické oblasti.
Jako součást aktualizací, které přinesl vývoj jazyka, přidalo C++ ve svém vydání z roku 2011 podporu pro výrazy lambda.
Co přesně je výraz lambda a jak jej můžete využít ve svůj prospěch jako programátor v C++?
Co je výraz lambda?
Výraz lambda je také známý jako funkce lambda. Je to inline výraz se schopností přijímat argumenty, provádět operace a vracet hodnotu, stejně jako typická funkce.
Lambda můžete použít uvnitř jiné funkce a přiřadit ji k proměnné. Lamba funkce jsou praktický způsob, jak definovat anonymní funkční objekt v programu. Téměř každý jazyk podporuje lambdy, i když každá implementace se liší od ostatních.
Jaké jsou části lambda výrazu C++?
Lambda výrazy se v C++ snadno používají. Syntaxi výrazu lambda v C++ můžete rozdělit takto:
[klauzule_zachycení](parametry) options { tělo_výrazu; }
Například:
int val = 13;
auto sumPlusVal = [hodnota](int A, int b) proměnlivýno kromě ->int { vrátit se val + a + b; };
sumPlusVal(2, 5); // 20
Tento kód deklaruje sumPlusVal proměnná auto, protože výraz lambda může přijmout a vrátit jakýkoli datový typ. To ponechává na kompilátoru, aby určil typ během kompilace.
Z výše uvedeného kódu můžete vidět, že výraz lambda obsahuje několik částí, které určují, jak funguje. Zde je rychlý přehled každé z těchto součástí.
-
Zachycovací klauzule: Toto je první část výrazu lambda, kde můžete specifikovat již existující proměnné nebo definovat nové pro použití v těle výrazu. Existují různé způsoby, jak určit zachycení, například:
auto addDwo = [foo](){ vrátit se foo + 2; }; // podle hodnoty
auto addThree = [&bar](){ vrátit se pruh + 3; }; // Odkazem
auto addAllVal = [=](){ vrátit se foo + bar; }; // vše podle hodnoty
auto addAllRef = [&](){ vrátit se foo + bar; }; // vše podle odkazu// vytvoří proměnnou v klauzuli capture
auto createVarInCapture = [fooBar = foo + bar](){ vrátit se fooBar * 5; };// no capture - vrátí chybu, protože foo není přístupný
auto errorExpression = [](){ vrátit se foo + 2; }; - Parametry: Tato část výrazu lambda je také volitelná. Obsahuje parametry funkce požadované lambda. To se nijak neliší od obvyklého způsobu, jakým byste definovali parametry funkcí v C++.
-
Možnosti: Můžete také zadat volby při definování výrazu lambda. Některé možnosti, které můžete použít, jsou: proměnlivý, výjimka (např no kromě v prvním ukázkovém kódu), ->return_type (např ->int), vyžaduje, atributy, atd. The proměnlivý Tato možnost se často používá, protože umožňuje modifikovat zachycení uvnitř lambda. Níže uvedený kód to ukazuje.
Přestože se ostatní možnosti používají zřídka, můžete o nich získat více informací na cppreference.com stránka o lambdach.int hodnota = 10;
// vrátí chybu - hodnota je const uvnitř výrazu
automatické snížení = [hodnota](){ vrátit se --hodnota; };
automatický přírůstek = [hodnota]() měnitelné { vrátit se ++hodnota; };
přírůstek(); // 11 - Tělo výrazu: Toto je tělo výrazu lambda, které vykonává a vrací hodnotu, podobně jako by to dělala funkce. V případě potřeby můžete tělo výrazu lambda rozdělit na více než jeden řádek. Je však osvědčeným postupem, aby byl co nejstručnější, abyste předešli neuspořádanému kódu.
Jaké jsou výhody lambda výrazů?
Používání funkcí lambda ve vašem kódu má mnoho výhod. Kromě zvýšené rychlosti vývoje a efektivity jsou hlavní výhody, které získáte od lambd, následující:
- Lambda výrazy pomáhají udržovat kód čistý. Jedním z nejlepších způsobů, jak udržet váš kód jednoduchý a úhledný, je použití lambdas, kde je to možné. To může být velmi užitečné při udržování čitelné a opakovaně použitelné struktury kódu.
-
Lambdy můžete předávat dalším funkcím jako parametry. The standardní knihovny C++std:: sort() metoda využívá této výhody. Jako jeden z parametrů této metody můžete předat lambda, abyste určili, jak má funkce provádět řazení. Například:
std:: vektor<int> arr = {2, 5, 1, 3, 4};
std:: sort (arr.begin(), arr.end(), [](int A, int b){ vrátit se a < b; });
// arr = {1, 2, 3, 4, 5} -
Lambdy jsou opakovaně použitelné. Někdy můžete chtít, aby byl blok kódu znovu použitelný v rozsahu funkce ve vašem programu, aniž byste museli definovat novou funkci. Lambdy mohou být v takových případech velmi užitečné. Zvažte následující příklad opakovaně použitelného výrazu lambda:
Tento program vytváří následující výsledek: Tento příklad ukazuje, jak jednoduché je definovat lambdu, abyste ji mohli použít s jakýmkoli typem.#zahrnout <iostream>
použitím jmenný prostorstd;inthlavní(){
// definovat opakovaně použitelnou lambdu
auto addUp = [](auto a, auto b, auto c) noexcept {
cout <<"Nyní sečteno... "<< A <<", "<< b <<" a "<< C << endl;
vrátit se a + b + c;
};cout << addUp (22, 33, 44) << endl;
cout << addUp (řetězec("Šťastný "), tětiva("Narození"), tětiva("den")) << endl;
cout << addUp(skutečný, Nepravdivé, skutečný) << std:: endl; // se provede jako čísla (1 a 0)
}
Použití lambd v C++
Existuje mnoho dalších výhod, které lambda výrazy nabízejí, a objevíte je, až bude struktura vašeho programu složitější. Ve skutečnosti programátoři C++ někdy označují výrazy lambda jako uzávěry, protože jsou tak skvělým způsobem, jak implementovat uzávěry v kódu.
Pokud chcete do své kódové základny začlenit moderní koncepty C++, měli byste zvážit výrazy lambda.