Lambda výrazy v jazyce C++
V aplikaci Visual C++, lambda výraz – jen lambda– je jako anonymní funkce, která udržuje stav a přístup k proměnným, které jsou k dispozici pro nadřazený obor.Tento článek definuje, co jsou lambda výrazy, porovnává je jiné programovací techniky, popisuje své výhody a poskytuje základní příklad.
O lambda výrazy
Mnoho programovacích jazyků podporují koncept anonymní funkce, což je funkce, která má tělo, ale nemá název.Lambda je programovací techniky, která souvisí s anonymní funkce.Lambda implicitně definuje třídu objektu funkce a sestaví objekt funkce tohoto typu třídy.Další informace o funkci objekty, viz Objekty funkce.
Důležité |
---|
Lambda výrazy nejsou podporovány následující běžné jazyk runtime (CLR) spravované entity: ref class, ref struct, value class, nebo value struct. |
Funkce objekty VS. lambda výrazy
Při psaní kódu pravděpodobně použijete ukazatelů funkcí a funkcí objektů k řešení potíží a provádění výpočtů, zvláště když použijete algoritmů STL.Ukazatelů funkcí a funkcí objektů mají své výhody a nevýhody – například ukazatele na funkci mají minimální režii syntaktické, ale není zachována státu v rámci oboru a funkce objekty můžete udržovat stav, ale vyžadují syntaktické režii definici třídy.
Lambda kombinuje výhody ukazatelů funkcí a funkcí objektů a je zabráněno jejich nevýhody.Podobně jako funkce objektů lambda je flexibilní a lze udržovat stav, ale na rozdíl od funkce objektu, jeho kompaktní syntaxe nevyžaduje definici třídy.Pomocí lambda výrazy můžete napsat kód, který je méně náročný a méně náchylný k chybám než kód objektu ekvivalentní funkce.
Následující příklady porovnat použití lambda použití funkce objektu.První příklad používá lambda tisk do konzoly zda každý prvek vector objekt je sudé nebo liché.Druhý příklad používá objekt funkce k provedení stejné úlohy.
Příklad 1: Použití Lambda
Tento příklad používá lambda, která je vložena v for_each funkce volání, chcete-li tisknout do konzoly zda každý prvek vector objekt je sudé nebo liché.
Kód
// even_lambda.cpp
// compile with: cl /EHsc /nologo /W4 /MTd
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// Create a vector object that contains 10 elements.
vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
// Count the number of even numbers in the vector by
// using the for_each function and a lambda.
int evenCount = 0;
for_each(v.begin(), v.end(), [&evenCount] (int n) {
cout << n;
if (n % 2 == 0) {
cout << " is even " << endl;
++evenCount;
} else {
cout << " is odd " << endl;
}
});
// Print the count of even numbers to the console.
cout << "There are " << evenCount
<< " even numbers in the vector." << endl;
}
Výsledek
0 is even
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
There are 5 even numbers in the vector.
Komentáře
V příkladu, že třetí argument for_each funkce je lambda.[&evenCount] Část určuje klauzule zachycení výrazu, (int n) určuje seznam parametrů a zbývající část určuje subjekt výraz.
Příklad 2: Použití funkce objektu
Lambda by někdy příliš nepraktické trvat mnohem déle, než v předchozím příkladu.Následující příklad používá objekt funkce namísto lambda, spolu s for_each funkce ke stejným výsledkům jako příklad 1.Oba příklady uložení počet sudá čísla v vector objektu.K udržení stavu operace, FunctorClass třídy úložiště m_evenCount proměnné odkazem jako členskou proměnnou.K provedení operace, FunctorClass implementuje operátor volání funkce operator().Kompilátor Visual C++ vygeneruje kód, který je srovnatelné velikosti a výkonu lambda kódu v příkladu 1.Pro základní problém stejný, jako je v tomto článku jednodušší lambda je pravděpodobně lepší než objekt funkce návrhu.Ale pokud si myslíte, že funkce mohou vyžadovat značné rozšíření v budoucnu, pak používejte návrh objektu funkce tak, aby kód údržby bude snazší.
Pro více informací o operator() si prohlédněte Volání funkce (C++).Další informace o for_each fungovat, viz for_each.
Kód
// even_functor.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class FunctorClass
{
public:
// The required constructor for this example.
explicit FunctorClass(int& evenCount)
: m_evenCount(evenCount)
{
}
// The function-call operator prints whether the number is
// even or odd. If the number is even, this method updates
// the counter.
void operator()(int n) const
{
cout << n;
if (n % 2 == 0) {
cout << " is even " << endl;
++m_evenCount;
} else {
cout << " is odd " << endl;
}
}
private:
// Default assignment operator to silence warning C4512.
FunctorClass& operator=(const FunctorClass&);
int& m_evenCount; // the number of even variables in the vector.
};
int main()
{
// Create a vector object that contains 10 elements.
vector<int> v;
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
// Count the number of even numbers in the vector by
// using the for_each function and a function object.
int evenCount = 0;
for_each(v.begin(), v.end(), FunctorClass(evenCount));
// Print the count of even numbers to the console.
cout << "There are " << evenCount
<< " even numbers in the vector." << endl;
}
SHRNUTÍ
Lambda výrazy jsou výkonné a výrazové programovací techniky.Další informace o části a vlastnosti lambda, viz Lambda syntaxi výrazu.Další informace o použití lambda výrazy v aplikacích sady, viz Příklady výrazů Lambda.