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
Description
Da ein Lambda-Ausdruck typisiert wird, können Sie ihn in einer auto-Variablen oder einem function-Objekt, wie im folgenden Beispiel gezeigt, zuweisen:
Code
// 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; };
}
Kommentare
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.
Description
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.
Code
// 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;
}
Ausgabe
47
Kommentare
[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.
Description
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:
Code
// 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;
}
Ausgabe
9
Description
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.
Code
// 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;
}
}
Ausgabe
The first even number in the list is 42.
Kommentare
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>.
Description
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.
Code
// 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;
}
Ausgabe
33
Kommentare
Weitere Informationen zum Funktionsaufrufoperator finden Sie unter Funktionsaufruf (C++).
[In diesem Abschnitt]
Beispiel: Lambda-Ausdrücke schachteln
Description
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.
Code
// 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;
}
Ausgabe
13
Kommentare
In diesem Beispiel ist [](int y) { return y * 2; } der geschachtelte Lambda-Ausdruck.
[In diesem Abschnitt]
Beispiel: Höherwertige Lambda-Funktionen
Description
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:
Code
// 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;
}
Ausgabe
16
Kommentare
[In diesem Abschnitt]
Beispiel: Die Verwendung eines Lambda-Ausdrucks in einer Methode
Description
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);
}
Ausgabe
9
18
27
Kommentare
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
Description
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.
Code
// 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);
}
Ausgabe
-34
43
-56
Kommentare
(Weitere Informationen zu C++-Vorlagen finden Sie unter Vorlagen.)
[In diesem Abschnitt]
Beispiel für die Ausnahmebehandlung
Description
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.
Code
// 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;
};
}
Ausgabe
Caught 'invalid vector<T> subscript'.
Kommentare
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
Description
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.
Code
// 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");
}
Ausgabe
Hello!
Kommentare
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
Auto-Schlüsselwort (Typ-Ableitung)
Ausnahmebehandlung in Visual C++