Příklady výrazů Lambda
Toto téma obsahuje příklady použití lambda výrazů v programech.Přehled lambda výrazů naleznete v tématu Lambda výrazy v jazyce C++.Další informace o struktuře lambda výraz Lambda syntaxi výrazu.
V tomto oddíle
Příklad: Deklarování Lambda výrazů
Příklad: Volání Lambda výrazů
Příklad: Vnoření Lambda výrazů
Příklad: Lambda vyšší pořadí funkcí
Příklad: Pomocí metody Lambda výraz
Příklad: Použití Lambda výrazů pomocí šablon
Příklad: Zpracování výjimek
Příklad: Použití spravovaných typů Lambda výrazů
Příklad: Deklarování Lambda výrazů
Description
Protože je zadán výraz lambda, můžete přiřadit k auto proměnné nebo function objektu, jak je znázorněno v následujícím příkladu:
Kód
// declaring_lambda_expressions1.cpp
#include <functional>
int main()
{
// Assign the lambda expression that adds two numbers to an auto variable.
auto f1 = [] (int x, int y) { return x + y; };
// Assign the same lambda expression to a function object.
function<int (int, int)> f2 = [] (int x, int y) { return x + y; };
}
Komentáře
Další informace o auto klíčové slovo, viz Automatické klíčové slovo (typ srážky).Pro více informací o function class si prohlédněte function Class.
Přestože lambda výrazy jsou nejčastěji deklarované v těle funkce nebo metody, můžete deklarovat kdekoli můžete proměnnou inicializujete.
Description
Kompilátor Visual C++ sváže lambda výraz jeho proměnné sebraných při výraz je deklarována místo při volání výraz.Následující příklad ukazuje výraz lambda shromažďuje místní proměnné i hodnotu a místní proměnné j odkazem.Protože lambda výraz zachycuje i hodnotou přeřazení z i dále v programu neovlivní výsledek výrazu.Ale protože lambda výraz zachycuje j odkazem přeřazení j ovlivnit výsledek výrazu.
Kód
// declaring_lambda_expressions2.cpp
// compile with: /EHsc
#include <iostream>
#include <functional>
int main()
{
using namespace std;
int i = 3;
int j = 5;
// The following lambda expression captures i by value and
// j by reference.
function<int (void)> f = [i, &j] { return i + j; };
// Change the values of i and j.
i = 22;
j = 44;
// Call f and print its result.
cout << f() << endl;
}
Výsledek
47
Komentáře
[V tomto oddíle]
Příklad: Volání Lambda výrazů
Můžete volat přímo lambda výraz nebo jej předá jako argument algoritmy standardní šablonu knihovny (STL), jako find_if.
Description
Následující příklad prohlašuje lambda výraz, který vrátí součet dvou celých čísel a volá výraz okamžitě s argumenty 5 a 4:
Kód
// calling_lambda_expressions1.cpp
// compile with: /EHsc
#include <iostream>
int main()
{
using namespace std;
int n = [] (int x, int y) { return x + y; }(5, 4);
cout << n << endl;
}
Výsledek
9
Description
Následující příklad předává jako argument lambda výraz find_if funkce.Lambda výraz vrací true pokud jeho parametr je sudé číslo.
Kód
// calling_lambda_expressions2.cpp
// compile with: /EHsc
#include <list>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
// Create a list of integers with a few initial elements.
list<int> numbers;
numbers.push_back(13);
numbers.push_back(17);
numbers.push_back(42);
numbers.push_back(46);
numbers.push_back(99);
// Use the find_if function and a lambda expression to find the
// first even number in the list.
const list<int>::const_iterator result =
find_if(numbers.begin(), numbers.end(),
[](int n) { return (n % 2) == 0; });
// Print the result.
if (result != numbers.end())
{
cout << "The first even number in the list is "
<< (*result)
<< "."
<< endl;
}
else
{
cout << "The list contains no even numbers."
<< endl;
}
}
Výsledek
The first even number in the list is 42.
Komentáře
Další informace o find_if fungovat, viz find_if.Další informace o funkcích STL, které provádějí algoritmy, viz <algorithm>.
Description
Můžete vyvolat lambda výraz, který je přiřazena proměnné pomocí operátoru volání funkce operator().Následující příklad přiřazuje lambda výraz auto proměnnou a poté operátor používá volání funkce vyvolat lambda výraz:
Kód
// calling_lambda_expressions3.cpp
// compile with: /EHsc
#include <iostream>
int main()
{
using namespace std;
// Assign the lambda expression that adds two numbers to an
// auto variable.
auto f = [] (int x, int y) { return x + y; };
// Invoke the function object and print its result.
cout << f(21, 12) << endl;
}
Výsledek
33
Komentáře
Další informace o operátor volání funkce, viz Volání funkce (C++).
[V tomto oddíle]
Příklad: Vnoření Lambda výrazů
Description
Vnoření lambda výraz do druhého.Následující příklad ukazuje výraz lambda, která obsahuje další lambda výraz.Vnitřní lambda výraz násobí 2 svůj argument a vrátí výsledek.Vnější lambda výraz volá vnitřní lambda výraz s argumentem a přidá k výsledku 3.
Kód
// nesting_lambda_expressions.cpp
// compile with: /EHsc
#include <iostream>
int main()
{
using namespace std;
// The following lambda expression contains a nested lambda
// expression.
int m = [](int x)
{ return [](int y) { return y * 2; }(x) + 3; }(5);
// Print the result.
cout << m << endl;
}
Výsledek
13
Komentáře
V tomto příkladu [](int y) { return y * 2; } je vnořená lambda výraz.
[V tomto oddíle]
Příklad: Lambda vyšší pořadí funkcí
Description
Pojem podporuje mnoho programovacích jazyků funkce vyšší pořadí. Funkce vyšší pořadí je lambda výraz, který trvá další lambda výraz jako svůj argument nebo lambda výraz, který vrací.Můžete použít function jako třída povolit pro C++ lambda výraz chování funkce vyšší pořadí.Následující příklad ukazuje lambda výraz, který vrací function objektu a lambda výraz, který trvá function objektu jako svůj argument:
Kód
// higher_order_lambda_expression.cpp
// compile with: /EHsc
#include <iostream>
#include <functional>
int main()
{
using namespace std;
// The following code declares a lambda expression that returns
// another lambda expression that adds two numbers.
// The returned lambda expression captures parameter x by value.
auto g = [](int x) -> function<int (int)>
{ return [=](int y) { return x + y; }; };
// The following code declares a lambda expression that takes another
// lambda expression as its argument.
// The lambda expression applies the argument z to the function f
// and adds 1.
auto h = [](const function<int (int)>& f, int z)
{ return f(z) + 1; };
// Call the lambda expression that is bound to h.
auto a = h(g(7), 8);
// Print the result.
cout << a << endl;
}
Výsledek
16
Komentáře
[V tomto oddíle]
Příklad: Pomocí metody Lambda výraz
Description
Lambda výrazy v tělo metody lze použít.Metoda nebo datový člen přístup ohraničujícím metoda přístup lambda výraz.Můžete explicitně nebo implicitně zachytit this ukazatele poskytují přístup členům ohraničující třídy metody a data.
Následující příklad ukazuje Scale třídy, která zapouzdřuje hodnota měřítka.ApplyScale Metoda používá výraz lambda tisk produktu každý prvek vector objektu a hodnoty měřítka.Lambda výraz explicitně zachycuje this ukazatel tak, že přístup _scale člen.
// method_lambda_expression.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Scale
{
public:
// The constructor.
explicit Scale(int scale)
: _scale(scale)
{
}
// Prints the product of each element in a vector object
// and the scale value to the console.
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[this](int n) { cout << n * _scale << endl; });
}
private:
int _scale;
};
int main()
{
vector<int> values;
values.push_back(3);
values.push_back(6);
values.push_back(9);
// Create a Scale object that scales elements by 3 and apply
// it to the vector object.
Scale s(3);
s.ApplyScale(values);
}
Výsledek
9
18
27
Komentáře
Můžete použít this ukazatele explicitně v metoda, jak je znázorněno v následujícím příkladu:
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[this](int n) { cout << n * this->_scale << endl; });
}
Můžete zachytit this ukazatel implicitně, jak je znázorněno v následujícím příkladu:
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[=](int n) { cout << n * _scale << endl; });
}
[V tomto oddíle]
Příklad: Použití Lambda výrazů pomocí šablon
Description
Protože jsou zadány lambda výrazů, můžete jim se šablonami jazyka C++.Následující příklad ukazuje negate_all a print_all funkcí.negate_all Funkce se vztahuje unární operator- na každý prvek vector objektu.print_all Funkce vytiskne každý prvek vector objekt do konzoly.
Kód
// template_lambda_expression.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
// Negates each element in the vector object.
template <typename T>
void negate_all(vector<T>& v)
{
for_each(v.begin(), v.end(), [] (T& n) { n = -n; } );
}
// Prints to the console each element in the vector object.
template <typename T>
void print_all(const vector<T>& v)
{
for_each(v.begin(), v.end(), [] (const T& n) { cout << n << endl; } );
}
int main()
{
// Create a vector of integers with a few initial elements.
vector<int> v;
v.push_back(34);
v.push_back(-43);
v.push_back(56);
// Negate each element in the vector.
negate_all(v);
// Print each element in the vector.
print_all(v);
}
Výsledek
-34
43
-56
Komentáře
Další informace o šablonách C++, viz Šablony.
[V tomto oddíle]
Příklad: Zpracování výjimek
Description
Subjekt takto lambda Výraz pravidla pro obě strukturované zpracování výjimky (SEH) a zpracování výjimek v C++.Lze zpracovávat zvýšené výjimku v těle lambda výraz nebo pozdržet zpracování ohraničující oblast působnosti výjimek.V následujícím příkladu for_each funkce a lambda výraz výplň, jeden vector s hodnotami jiného objektu.Použije try/catch bloku zpracovat Neplatný přístup k prvním vektoru.
Kód
// eh_lambda_expression.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
// Create a vector that contains 3 elements.
vector<int> elements(3);
// Create another vector that contains index values.
vector<int> indices(3);
indices[0] = 0;
indices[1] = -1; // This is not a subscript. It will trigger the exception.
indices[2] = 2;
// Use the values from the vector of index values to
// fill the elements vector. This example uses a
// try/catch block to handle invalid access to the
// elements vector.
try
{
for_each(indices.begin(), indices.end(),
[&] (int index) { elements.at(index) = index; });
}
catch (const out_of_range& e)
{
cerr << "Caught '" << e.what() << "'." << endl;
};
}
Výsledek
Caught 'invalid vector<T> subscript'.
Komentáře
Další informace o zpracování výjimek, viz Zpracování výjimek v jazyce Visual C++.
[V tomto oddíle]
Příklad: Použití spravovaných typů Lambda výrazů
Description
Sběr klauzule lambda výraz nemůže obsahovat spravované typu proměnné.Však můžete předat argument typu spravované do seznamu parametr lambda výraz.Následující příklad obsahuje lambda výraz, který zachycuje místní proměnné nespravované ch hodnotu a trvá System.String jako svůj parametr objekt:
Kód
// managed_lambda_expression.cpp
// compile with: /clr
using namespace System;
int main()
{
char ch = '!'; // a local unmanaged variable
// The following lambda expression captures local variables
// by value and takes a managed String object as its parameter.
[=] (String ^s)
{ Console::WriteLine(s + Convert::ToChar(ch)); }("Hello");
}
Výsledek
Hello!
Komentáře
Lambda výrazy můžete použít také s knihovnou STL/CLR.Další informace o STL/CLR viz Reference knihovny STL/CLR.
[V tomto oddíle]
Viz také
Referenční dokumentace
Automatické klíčové slovo (typ srážky)
Zpracování výjimek v jazyce Visual C++