Udostępnij za pośrednictwem


Przykłady wyrażeń Lambda

Ten temat zawiera przykłady wyrażeń lambda programów.Omówienie wyrażenia lambda, zobacz Lambda wyrażenia w języku C++.Aby uzyskać więcej informacji na temat struktury wyrażenie lambda zobacz Składni wyrażenia lambda.

W tej sekcji

Przykład: Deklarowanie wyrażenia Lambda

Przykład: Wywołanie wyrażenia Lambda

Przykład: Zagnieżdżanie wyrażenia Lambda

Przykład: Funkcji wyższego rzędu Lambda

Przykład: Użycie wyrażenia Lambda w metodzie

Przykład: Użycie wyrażenia Lambda z szablonami

Przykład: Obsługa wyjątków

Przykład: Użycie wyrażenia Lambda typy zarządzanych

Przykład: Deklarowanie wyrażenia Lambda

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Ponieważ wyrażenie lambda jest wpisana, można przypisać je do auto zmienną lub function obiektów, jak pokazano w następującym przykładzie:

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifKomentarze

Więcej informacji o auto słowa kluczowego, zobacz Auto słowa kluczowego (Typ potrącenia).Więcej informacji o function class, zobacz function Class.

Chociaż wyrażenia lambda najczęściej są zadeklarowane w treści metody lub funkcji, można je gdziekolwiek że można zainicjować zmienną zadeklarować.

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Kompilator Visual C++ wiąże wyrażenie lambda swoje zmienne przechwyconych podczas wyrażenie jest zadeklarowany zamiast, gdy wywoływana jest wyrażenie.Poniższy przykład ilustruje wyrażenie lambda, który przechwytuje zmiennej lokalnej i , a wartość zmiennej lokalnej j przez odwołanie.Ponieważ wyrażenie lambda przechwytuje i przez wartość przystosowanie i później w programie nie wpływa na wynik wyrażenia.Jednakże ponieważ wyrażenie lambda przechwytuje j przez odniesienie, ponowne przypisanie z j wpływa na wynik wyrażenia.

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

47

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

[W tej sekcji]

Przykład: Wywołanie wyrażenia Lambda

Można bezpośrednio wywołać wyrażenie lambda lub przekazać go jako argument do algorytmów standardowy szablon biblioteki (STL) takie jak find_if.

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Poniższy przykład deklaruje wyrażenie lambda, która zwraca sumę dwóch liczb całkowitych i wywołuje wyrażenie bezpośrednio z argumentami 5 i 4:

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

9

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

W poniższym przykładzie przekazuje wyrażenie lambda jako argument find_if funkcji.Zwraca wyrażenie lambda true , jeśli jej parametr liczba jest parzysta.

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

The first even number in the list is 42.

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

Więcej informacji o find_if działać, zobacz find_if.Aby uzyskać więcej informacji na temat funkcji STL, wykonujących algorytmy zobacz <algorithm>.

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Można wywołać wyrażenie lambda, która jest przypisana do zmiennej za pomocą operatora wywołanie funkcji operator().Poniższy przykład przypisuje wyrażenie lambda auto zmiennej, a następnie operator używa wywołania funkcji do wywołania wyrażenie lambda:

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

33

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

Aby uzyskać więcej informacji na temat operator wywołanie funkcji, zobacz Wywołanie funkcji (C++).

[W tej sekcji]

Przykład: Zagnieżdżanie wyrażenia Lambda

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Można zagnieżdżać wyrażenia lambda innej.W poniższym przykładzie wyrażenie lambda, zawierający innego wyrażenia lambda.Wyrażenie lambda wewnętrzne mnoży 2 argument i zwraca wynik.Wyrażenie lambda zewnętrzne wyrażenia lambda wewnętrzne z argumentem wywołania i dodaje do wyniku 3.

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

13

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

W tym przykładzie [](int y) { return y * 2; } jest wyrażenie lambda zagnieżdżonych.

[W tej sekcji]

Przykład: Funkcji wyższego rzędu Lambda

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Wiele języków programowania wsparcie koncepcji funkcji wyższego rzędu. Funkcja wyższego rzędu jest wyrażenie lambda, która pobiera innego wyrażenia lambda jako argument lub że zwraca wartość wyrażenia lambda.Można użyć function klasy umożliwiające wyrażenie lambda C++ zachowują się jak funkcja wyższego rzędu.Poniższy przykład ilustruje wyrażenie lambda, która zwraca function obiektu i wyrażenie lambda, który ma function obiektu jako argumentu:

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

16

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

[W tej sekcji]

Przykład: Użycie wyrażenia Lambda w metodzie

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Można użyć wyrażenia lambda w treści metody.Wyrażenie lambda dostęp każdy członek metody lub danych otaczający metody można uzyskać dostęp.Można jawnie lub niejawnie przechwycić this wskaźnik, aby zapewnić dostęp do metod i danych członkowie klasy okalającego.

W poniższym przykładzie Scale klasy, która hermetyzuje wartości skali.ApplyScale Metoda używa wyrażenia lambda drukowania produktu każdy element w vector obiektu i wartość skali.Wyrażenie lambda jawnie przechwytuje this wskaźnik, tak że można uzyskać dostęp _scale Członkowskich.

// 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(pl-pl,VS.110).gifDane wyjściowe

9
18
27

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

Można użyć this wskaźnik jawnie w metodzie, jak pokazano w następującym przykładzie:

void ApplyScale(const vector<int>& v) const
{
   for_each(v.begin(), v.end(), 
      [this](int n) { cout << n * this->_scale << endl; });
}

Można przechwytywać this wskaźnik niejawnie, jak pokazano w następującym przykładzie:

void ApplyScale(const vector<int>& v) const
{
   for_each(v.begin(), v.end(), 
      [=](int n) { cout << n * _scale << endl; });
}

[W tej sekcji]

Przykład: Użycie wyrażenia Lambda z szablonami

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Ponieważ są wpisywane wyrażenia lambda, można je z szablonów języka C++.W poniższym przykładzie negate_all i print_all funkcji.negate_all Funkcji dotyczy jednoargumentowe operator- do każdego elementu w vector obiektu.print_all Funkcji drukuje każdy element w vector obiektu do konsoli.

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

-34
43
-56

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

Aby uzyskać więcej informacji na temat szablonów języka C++, zobacz Szablony.

[W tej sekcji]

Przykład: Obsługa wyjątków

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Jednostka lambda następujące wyrażenie reguły dla obu struktury obsługi wyjątków (SEH) i obsługę wyjątków C++.Można obsłużyć wyjątek w treści wyrażenie lambda lub odroczenie obsługi wyjątków do zasięgu.W poniższym przykładzie użyto for_each funkcji i wyrażenie lambda do wypełnienia jedną vector obiekt z innej wartości.Używa on try/catch bloku obsługi nieprawidłowy dostęp do pierwszym wektorze.

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

Caught 'invalid vector<T> subscript'.

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

Aby uzyskać więcej informacji na temat obsługi wyjątków, zobacz Obsługa wyjątków w programie Visual C++.

[W tej sekcji]

Przykład: Użycie wyrażenia Lambda typy zarządzanych

Dd293599.collapse_all(pl-pl,VS.110).gifOpis

Klauzula przechwytywania wyrażenia lambda nie może zawierać zmienna typu zarządzanego.Jednakże można przekazać argumentu typu zarządzanego do listy parametrów wyrażenia lambda.Poniższy przykład zawiera wyrażenie lambda, który przechwytuje niezarządzanych zmiennej lokalnej ch przez wartość i ma System.String obiekt jako parametr:

Dd293599.collapse_all(pl-pl,VS.110).gifKod

// 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(pl-pl,VS.110).gifDane wyjściowe

Hello!

Dd293599.collapse_all(pl-pl,VS.110).gifKomentarze

Można również wyrażenia lambda z biblioteki STL/CLR.Aby uzyskać więcej informacji na temat STL/CLR zobacz Odwołanie do biblioteki STL/CLR..

[W tej sekcji]

Zobacz też

Informacje

Lambda wyrażenia w języku C++

Składni wyrażenia lambda

Auto słowa kluczowego (Typ potrącenia)

function Class

find_if

<algorithm>

Wywołanie funkcji (C++)

Obsługa wyjątków w programie Visual C++

Inne zasoby

Szablony

Odwołanie do biblioteki STL/CLR.