Lambda-Ausdrücke in C++

In Visual C++ Ausdruck-verwies ein Lambda zu, wie eine als eine anonyme Funktion Lambda-ist, die Zustand aufweist und auf die Variablen zugreifen kann, die für den einschließenden Bereich verfügbar sind.Dieser Artikel definiert, was Lambdas sind, vergleicht sie mit anderen Programmiertechniken, beschreibt ihre Vorteile und setzt ein grundlegendes Beispiel fest.

Über Lambdas

Viele Programmiersprachen unterstützen das Konzept einer anonymen Funktion, die eine Funktion, die einen Text enthält, aber keinen Namen haben.Ein Lambda-Ausdruck ist ein Programmiertechnik, das für anonyme Funktionen verknüpft ist.Das Lambda implizit definiert eine Funktionsobjektklasse und erstellt ein Funktionsobjekt dieses Klassentyps.Weitere Informationen zu Funktionsobjekte, finden Sie unter Funktionsobjekte.

Wichtiger HinweisWichtig

Bei Lambdas werden nicht in die folgenden verwalteten Entitäten der CLR (Common Language Runtime) unterstützt: ref class, ref struct, value class oder value struct.

Funktionsobjekte VS . Lambdas

Wenn Sie Code schreiben, verwenden Sie wahrscheinlich Funktionszeiger und Funktionsobjekte, um Probleme zu lösen und Berechnungen auszuführen, insbesondere wenn Sie STL-Algorithmen verwenden.Funktionszeiger und Funktionsobjekte haben Vorteile und Nachteil-für Beispiel haben, Funktionszeiger, minimalen Aufwand syntaktischen aber behalten keine Zustand innerhalb eines Bereichs bei, Funktionsobjekte Zustand beibehalten und können jedoch den syntaktischen Mehraufwand einer Klassendefinition erfordern.

Das Lambda kombiniert die Vorteile von Funktionszeigern und von Funktionsobjekten und vermeidet ihre Nachteile.Wie ist Funktionsobjekte, ein Lambda flexibel und kann Zustand beibehalten, aber als ein Funktionsobjekt, benötigt eine kompakte Syntax keine Klassendefinition.Indem Sie Lambdas verwenden, können Sie Code schreiben, der weniger sein und für Fehler als Code für ein entsprechendes Funktionsobjekt weniger anfällig ist.

Die folgenden Beispiele vergleichen die Verwendung eines Lambda der Verwendung von einem Funktionsobjekt.Im ersten Beispiel wird ein Lambda-Ausdruck, um in der Konsole auszugeben, ob jedes Element in einem - Objekt vector gleichmäßig oder ungerade ist.Das zweite Beispiel verwendet ein Funktionsobjekt, um die gleiche Aufgabe auszuführen.

Beispiel 1: Verwenden eines Lambda-Ausdrucks

In diesem Beispiel wird ein Lambda-Ausdruck, das im for_each-Funktionsaufruf eingebettet wird, um in der Konsole auszugeben, ob jedes Element in einem - Objekt vector gleichmäßig oder ungerade ist.

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

// even_lambda.cpp
// compile with: cl /EHsc /nologo /W4 /MTd
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() 
{
   // Create a vector object that contains 10 elements.
   vector<int> v;
   for (int i = 0; i < 10; ++i) {
      v.push_back(i);
   }

   // Count the number of even numbers in the vector by 
   // using the for_each function and a lambda.
   int evenCount = 0;
   for_each(v.begin(), v.end(), [&evenCount] (int n) {
      cout << n;

      if (n % 2 == 0) {
         cout << " is even " << endl;
         ++evenCount;
      } else {
         cout << " is odd " << endl;
      }
   });

   // Print the count of even numbers to the console.
   cout << "There are " << evenCount 
        << " even numbers in the vector." << endl;
}

Dd293608.collapse_all(de-de,VS.110).gifAusgabe

0 is even
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
There are 5 even numbers in the vector.

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

Im Beispiel ist das dritte Argument für die Funktion for_each ein Lambda.Der [&evenCount] Teil gibt die Erfassungsklausel des Ausdrucks an, gibt (int n) die Parameterliste an, und der Rest gibt den Text des Ausdrucks an.

Beispiel 2: Verwenden eines Funktionsobjekts

Manchmal kann ein Lambda zu hinderlich sein, viele weitere als das vorherige Beispiel zu erweitern.Im folgenden Beispiel wird ein Funktionsobjekt anstelle eines Lambda-Ausdrucks, zusammen mit der for_each-Funktion, um die gleichen Ergebnisse wie Beispiel 1. an.In beiden Beispielen speichern die Anzahl der geraden Zahlen in einem vector-Objekt.Um den Zustand des Vorgangs beizubehalten, speichert die FunctorClass-Klasse die m_evenCount-Variable durch Verweis als Membervariable.Um den Vorgang auszuführen, implementiert FunctorClass den Funktionsaufrufoperator, operator().Der Visual C++-Compiler generiert Code, der an Größe und Leistung mit dem Lambda-Code in Beispiel 1. vergleichbar ist.Ein grundlegendes Problem wie Sie das in diesem Artikel, der einfachere Lambda-Entwurf ist wahrscheinlich besser als der Funktionsobjektentwurf.Wenn Sie glauben, dass die Funktionalität kann beträchtliche Erweiterung in der Zukunft erforderlich, verwenden Sie einen Funktionsobjektentwurf, damit Codeverwaltung einfacher ist.

Weitere Informationen zum operator() finden Sie unter Funktionsaufruf (C++).Weitere Informationen zur for_each-Funktion finden Sie unter for_each..

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

// even_functor.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

class FunctorClass
{
public:
    // The required constructor for this example.
    explicit FunctorClass(int& evenCount) 
        : m_evenCount(evenCount)
    {
    }

    // The function-call operator prints whether the number is
    // even or odd. If the number is even, this method updates
    // the counter.
    void operator()(int n) const
    {
        cout << n;

        if (n % 2 == 0) {
            cout << " is even " << endl;
            ++m_evenCount;
        } else {
            cout << " is odd " << endl;
        }
    }

private:
    // Default assignment operator to silence warning C4512.
    FunctorClass& operator=(const FunctorClass&);

    int& m_evenCount; // the number of even variables in the vector.
};


int main() 
{
    // Create a vector object that contains 10 elements.
    vector<int> v;
    for (int i = 0; i < 10; ++i) {
        v.push_back(i);
    }

    // Count the number of even numbers in the vector by 
    // using the for_each function and a function object.
    int evenCount = 0;
    for_each(v.begin(), v.end(), FunctorClass(evenCount));

    // Print the count of even numbers to the console.
    cout << "There are " << evenCount 
        << " even numbers in the vector." << endl;
}

Zusammenfassung

Bei Lambdas sind ein leistungsstarkes und ausdrucksvolles Programmiertechniken.Um über die Teile und die Eigenschaften eines Lambda-Ausdrucks zu erfahren, finden Sie unter Lambda-Ausdruckssyntax.Wie Sie Lambdas in Programmen, finden Sie unter Beispiele für Lambda-Ausdrücke verwendet.

Siehe auch

Referenz

Funktionsaufruf (C++)

for_each

Konzepte

Funktionsobjekte

Weitere Ressourcen

C++-Sprachreferenz