Share via


Beispiele für Lambda-Ausdrücke

Dieses Thema enthält Beispiele für die Verwendung von Lambda-Ausdrücken in den Programmen.Eine Übersicht über Lambda-Ausdrücken finden Sie unter Lambda-Ausdrücke in C++.Weitere Informationen zur Struktur eines Lambda-Ausdrucks finden Sie unter Lambda-Ausdruckssyntax.

In diesem Abschnitt

Beispiel: Deklarieren von Lambda-Ausdrücken

Beispiel: Aufrufen von Lambda-Ausdrücken

Beispiel: Lambda-Ausdrücke schachteln

Beispiel: Höherwertige Lambda-Funktionen

Beispiel: Die Verwendung eines Lambda-Ausdrucks in einer Methode

Beispiel: Verwenden von Lambda-Ausdrücken mit Vorlagen

Beispiel für die Ausnahmebehandlung

Beispiel: Verwenden von Lambda-Ausdrücken mit verwalteten Typen

Beispiel: Deklarieren von Lambda-Ausdrücken

Dd293599.collapse_all(de-de,VS.110).gifDescription

Da ein Lambda-Ausdruck typisiert wird, können Sie ihn in einer auto-Variablen oder einem function-Objekt, wie im folgenden Beispiel gezeigt, zuweisen:

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifKommentare

Weitere Informationen über das auto-Schlüsselwort finden Sie unter Auto-Schlüsselwort (Typ-Ableitung).Weitere Informationen zum function class finden Sie unter function Class.

Obwohl Lambda-Ausdrücke am häufigsten im Text einer Methode oder Funktion deklariert werden, können Sie ihn überall da deklarieren, wo Sie eine Variable initialisieren können.

Dd293599.collapse_all(de-de,VS.110).gifDescription

Der Compiler für Visual C++ bindet einen Lambda-Ausdruck an die aufgezeichneten Variablen, wenn der Ausdruck deklariert wird, nicht wenn der Ausdruck aufgerufen wird.Das folgende Beispiel zeigt einen lambda-Ausdruck, welcher die lokale Variable i nach Wert erfasst und die lokale Variable j nach Verweis.Da der Lambda-Ausdruck i als Wert erfasst, wirkt sich die erneute Zuweisung von i später im Programm nicht auf das Ergebnis des Ausdrucks aus.Da der Lambda-Ausdruck j als Verweis aufzeichnet, wirkt sich die erneute Zuweisung von j auf das Ergebnis des Ausdrucks aus.

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

47

Dd293599.collapse_all(de-de,VS.110).gifKommentare

[In diesem Abschnitt]

Beispiel: Aufrufen von Lambda-Ausdrücken

Sie können einen Lambda-Ausdruck direkt aufrufen oder ihn als Argument an die STL (Standard Template Library)-Algorithmen, z. B. find_if, übergeben.

Dd293599.collapse_all(de-de,VS.110).gifDescription

Im folgenden Beispiel wird ein lambda-Ausdruck deklariert, welcher die Summe von zwei ganzen Zahlen zurückgibt und den Ausdruck sofort mit den Argumenten 5 und 4 aufruft:

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

9

Dd293599.collapse_all(de-de,VS.110).gifDescription

Im folgenden Beispiel wird ein lambda-Ausdruck als Argument an die Funktion find_if übergeben.Der lambda-Ausdruck gibt true zurück, wenn sein Parameter eine gerade Zahl ist.

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

The first even number in the list is 42.

Dd293599.collapse_all(de-de,VS.110).gifKommentare

Weitere Informationen zur find_if-Funktion finden Sie unter find_if..Weitere Informationen zu den STL-Funktionen, die Algorithmen ausführen, finden Sie unter <algorithm>.

Dd293599.collapse_all(de-de,VS.110).gifDescription

Sie können einen Lambdaausdruck aufrufen, der einer Variablen zugewiesen ist, indem Sie den Funktionsaufrufoperator operator() verwenden.Das folgende Beispiel weist einer auto-Variablen einen lambda-Ausdruck zu, und dann verwendet sie den Funktionsaufrufoperator, um den lambda-Ausdruck aufzurufen.

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

33

Dd293599.collapse_all(de-de,VS.110).gifKommentare

Weitere Informationen zum Funktionsaufrufoperator finden Sie unter Funktionsaufruf (C++).

[In diesem Abschnitt]

Beispiel: Lambda-Ausdrücke schachteln

Dd293599.collapse_all(de-de,VS.110).gifDescription

Sie können einen Lambda-Ausdruck in einen anderen schachteln.Das folgende Beispiel zeigt einen lambda-Ausdruck, der einen weiteren lambda-Ausdruck enthält.Der innere lambda-Ausdruck multipliziert sein Argument mit 2 und gibt das Ergebnis zurück.Der äußere Lambda-Ausdruck ruft den inneren Lambda-Ausdruck mit seinem Argument auf und fügt dem Ergebnis 3 hinzu.

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

13

Dd293599.collapse_all(de-de,VS.110).gifKommentare

In diesem Beispiel ist [](int y) { return y * 2; } der geschachtelte Lambda-Ausdruck.

[In diesem Abschnitt]

Beispiel: Höherwertige Lambda-Funktionen

Dd293599.collapse_all(de-de,VS.110).gifDescription

Viele Programmiersprachen unterstützen das Konzept einer Funktion höherer Ordnung. Eine höhere Funktion ist ein Lambda-Ausdruck, der einen anderen Lambda-Ausdruck als Argument akzeptiert, oder einen Lambda-Ausdruck zurückgibt.Sie können die function-Klasse verwenden, um zuzulassen, dass sich ein C++-Lambda-Ausdruck wie eine Funktion höherer Ordnung verhält.Das folgende Beispiel zeigt einen lambda-Ausdruck, der ein function-Objekt zurückgibt und einen lambda-Ausdruck, der ein function-Objekt als sein Argument abruft:

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

16

Dd293599.collapse_all(de-de,VS.110).gifKommentare

[In diesem Abschnitt]

Beispiel: Die Verwendung eines Lambda-Ausdrucks in einer Methode

Dd293599.collapse_all(de-de,VS.110).gifDescription

Sie können Lambda-Ausdrücke im Text einer Methode verwenden.Der lambda-Ausdruck kann auf jegliche Methode oder jeglichen Datenmember zugreifen, auf welchen die einschließende Methode Zugriff hat.Sie können den Zeiger this explizit oder implizit aufzeichnen, um den Zugriff auf die Methoden und Datenmember der einschließenden Klasse bereitzustellen.

Das folgende Beispiel zeigt die Klasse Scale, welche einen Skalierungswert umfasst.Die ApplyScale-Methode verwendet einen Lambda-Ausdruck, um das Produkt eines jeden Elements in einem vector-Objekt und den Skalenwert zu drucken.Der lambda-Ausdruck kann explizit auf den Zeiger this zugreifen, so dass er auf den Member _scale zugreifen kann.

// 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(de-de,VS.110).gifAusgabe

9
18
27

Dd293599.collapse_all(de-de,VS.110).gifKommentare

Sie können den this-Zeiger explizit in einer Methode verwenden, wie im folgenden Beispiel gezeigt:

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

Sie können den this-Zeiger auch explizit abfangen, wie im folgenden Beispiel gezeigt wird:

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

[In diesem Abschnitt]

Beispiel: Verwenden von Lambda-Ausdrücken mit Vorlagen

Dd293599.collapse_all(de-de,VS.110).gifDescription

Da Lambda-Ausdrücke typisiert sind, können Sie sie mit C++-Vorlagen verwenden.Im folgenden Beispiel werden die Funktionen negate_all und print_all dargestellt.Die negate_all-Funktion wendet den unären operator- auf jedes Element im vector-Objekt an.Die print_all-Funktion gibt jedes Element im vector-Objekt auf der Konsole aus.

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

-34
43
-56

Dd293599.collapse_all(de-de,VS.110).gifKommentare

(Weitere Informationen zu C++-Vorlagen finden Sie unter Vorlagen.)

[In diesem Abschnitt]

Beispiel für die Ausnahmebehandlung

Dd293599.collapse_all(de-de,VS.110).gifDescription

Der Text eines Lambda-Ausdrucks folgt den Regeln für die strukturierte Ausnahmebehandlung (SEH) und die C++-Ausnahmebehandlung.Sie können eine Ausnahme im Hauptteil eines Lambda-Ausdrucks behandeln oder die Ausnahmebehandlung auf den einschließenden Bereich verzögern.Im folgenden Beispiel wird die Funktion for_each und ein lambda-Ausdruck verwendet, um ein vector-Objekt mit den Werten eines anderen Objekts zu füllen.Es verwendet einen try/catch-Block, um ungültigen Zugriff auf den ersten Vektor zu behandeln.

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

Caught 'invalid vector<T> subscript'.

Dd293599.collapse_all(de-de,VS.110).gifKommentare

Weitere Informationen zur Behandlung von Ausnahmen finden Sie unter Ausnahmebehandlung in Visual C++.

[In diesem Abschnitt]

Beispiel: Verwenden von Lambda-Ausdrücken mit verwalteten Typen

Dd293599.collapse_all(de-de,VS.110).gifDescription

Die Erfassungsklausel eines Lambda-Ausdrucks kann keine Variable mit einem verwalteten Typ enthalten.Sie können jedoch ein Argument mit einem verwalteten Typ an die Parameterliste eines Lambda-Ausdrucks übergeben.Das folgende Beispiel enthält einen lambda-Ausdruck, welcher die lokale, unverwaltete Variable ch nach ihrem Wert erfasst und ein System.String-Objekt als seinen Parameter abruft.

Dd293599.collapse_all(de-de,VS.110).gifCode

// 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(de-de,VS.110).gifAusgabe

Hello!

Dd293599.collapse_all(de-de,VS.110).gifKommentare

Lambda-Ausdrücke können Sie auch mit der STL/CLR-Bibliothek verwenden.Weitere Informationen zu STL/CLR finden Sie unter STL/CLR-Bibliotheksreferenz.

[In diesem Abschnitt]

Siehe auch

Referenz

Lambda-Ausdrücke in C++

Lambda-Ausdruckssyntax

Auto-Schlüsselwort (Typ-Ableitung)

function Class

find_if

<algorithm>

Funktionsaufruf (C++)

Ausnahmebehandlung in Visual C++

Weitere Ressourcen

Vorlagen

STL/CLR-Bibliotheksreferenz