Sdílet prostřednictvím


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ů

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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:

Dd293599.collapse_all(cs-cz,VS.110).gifKó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; };
}

Dd293599.collapse_all(cs-cz,VS.110).gifKomentář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.

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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.

Dd293599.collapse_all(cs-cz,VS.110).gifKó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;
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

47

Dd293599.collapse_all(cs-cz,VS.110).gifKomentář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.

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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:

Dd293599.collapse_all(cs-cz,VS.110).gifKó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;
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

9

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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.

Dd293599.collapse_all(cs-cz,VS.110).gifKó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;
   }
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

The first even number in the list is 42.

Dd293599.collapse_all(cs-cz,VS.110).gifKomentáře

Další informace o find_if fungovat, viz find_if.Další informace o funkcích STL, které provádějí algoritmy, viz <algorithm>.

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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:

Dd293599.collapse_all(cs-cz,VS.110).gifKó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;
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

33

Dd293599.collapse_all(cs-cz,VS.110).gifKomentář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ů

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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.

Dd293599.collapse_all(cs-cz,VS.110).gifKó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;
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

13

Dd293599.collapse_all(cs-cz,VS.110).gifKomentář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í

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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:

Dd293599.collapse_all(cs-cz,VS.110).gifKó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;
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

16

Dd293599.collapse_all(cs-cz,VS.110).gifKomentáře

[V tomto oddíle]

Příklad: Pomocí metody Lambda výraz

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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);
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

9
18
27

Dd293599.collapse_all(cs-cz,VS.110).gifKomentář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

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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.

Dd293599.collapse_all(cs-cz,VS.110).gifKó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);
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

-34
43
-56

Dd293599.collapse_all(cs-cz,VS.110).gifKomentáře

Další informace o šablonách C++, viz Šablony.

[V tomto oddíle]

Příklad: Zpracování výjimek

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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.

Dd293599.collapse_all(cs-cz,VS.110).gifKó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;
   };
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

Caught 'invalid vector<T> subscript'.

Dd293599.collapse_all(cs-cz,VS.110).gifKomentář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ů

Dd293599.collapse_all(cs-cz,VS.110).gifDescription

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:

Dd293599.collapse_all(cs-cz,VS.110).gifKó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");
}

Dd293599.collapse_all(cs-cz,VS.110).gifVýsledek

Hello!

Dd293599.collapse_all(cs-cz,VS.110).gifKomentář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

Lambda výrazy v jazyce C++

Lambda syntaxi výrazu

Automatické klíčové slovo (typ srážky)

function Class

find_if

<algorithm>

Volání funkce (C++)

Zpracování výjimek v jazyce Visual C++

Další zdroje

Šablony

Reference knihovny STL/CLR