Espressioni lambda in C++
In Visual C++, un'espressione lambda espressione- fa riferimento a mentre un oggetto è lambda-come una funzione anonima che mantiene lo stato e può accedere alle variabili disponibili all'ambito che lo contiene.Questo articolo definisce le espressioni lambda sono, li confronta con altre tecniche di programmazione, vengono descritti i vantaggi e visualizza un esempio di base.
Sulle espressioni lambda
Molti linguaggi di programmazione supportano il concetto di una funzione anonima, una funzione che ha un corpo, ma non ha un nome.Un'espressione lambda è una tecnica di programmazione che è correlata alle funzioni anonime.Un'espressione lambda in modo implicito definisce una classe di oggetti funzione e costruisce un oggetto funzione con il tipo di classe.Per ulteriori informazioni sugli oggetti funzione, vedere Oggetti funzione.
Importante |
---|
Espressioni lambda non è supportato nelle entità gestite (CLR) di Common Language Runtime: ref class, ref struct, value class, o value struct. |
Oggetti funzione Lambda VS..
Quando si scrive codice, probabilmente si utilizzano i puntatori a funzione e gli oggetti funzione per risolvere i problemi ed eseguire calcoli, in particolare quando si utilizza Algoritmo STL.I puntatori a funzione e gli oggetti funzione presentano vantaggi e svantaggio-, ad esempio i puntatori a funzione dispongono di un sovraccarico minimo sintattico ma non mantengono lo stato interno di un ambito e gli oggetti funzione possono gestire lo stato e richiedere il sovraccarico sintattico di una definizione di classe.
Un'espressione lambda combinano i vantaggi dei puntatori a funzione e gli oggetti funzione e non i relativi svantaggi.Come gli oggetti, una funzione lambda è flessibile e possono gestire lo stato, a differenza di un oggetto funzione, la sintassi compressa non richiede la definizione di classe.Utilizzando le espressioni lambda, è possibile scrivere codice che corrisponde a errori meno complicato e meno soggetto al codice per un oggetto funzione equivalente.
Negli esempi seguenti viene confrontato l'utilizzo di un'espressione lambda all'utilizzo di un oggetto funzione.Il primo esempio viene utilizzata un'espressione lambda per stampare la console se ogni elemento in un oggetto di vector è uguale o dispari.Il secondo esempio viene utilizzato un oggetto funzione per eseguire la stessa attività.
Esempio 1: Utilizzando un'espressione lambda
In questo esempio viene utilizzata un'espressione lambda che è incorporata nella chiamata di funzione di for_each per stampare la console se ogni elemento in un oggetto di vector è uguale o dispari.
Codice
// 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;
}
Output
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.
Commenti
Nell'esempio, il terzo argomento alla funzione di for_each è lambda.La parte di [&evenCount] specifica la clausola di acquisizione dell'espressione, (int n) specifica l'elenco di parametri e la parte restante specifica il corpo dell'espressione.
Esempio 2: Utilizzando un oggetto funzione
Talvolta una lambda è troppo poco maneggevole per estendere in modo più che nell'esempio precedente.Nell'esempio seguente viene utilizzato un oggetto funzione anziché una lambda, con la funzione di for_each, per fornire gli stessi risultati di Esempio 1.Gli esempi includono il conteggio dei numeri pari in un oggetto di vector.Per gestire lo stato dell'operazione, la classe di FunctorClass archivia la variabile di m_evenCount per riferimento come variabile membro.Per eseguire l'operazione, FunctorClass implementa l'operatore di chiamata di funzione, operator().Il compilatore di Visual C++ genera il codice sia analogo nelle dimensioni e prestazioni nel codice di lambda nell'Esempio 1.Per un problema di base di questo tipo in questo articolo, la progettazione più semplice di lambda è probabilmente preferibile di progettazione dell'oggetto funzione.Tuttavia, se si prevede che la funzionalità potrebbe richiedere l'espansione significativa in futuro, quindi utilizzare una progettazione dell'oggetto funzione in modo che la manutenzione di codice risulterà più semplice.
Per ulteriori informazioni su operator(), vedere Chiamata di funzione (C++).Per ulteriori informazioni sulla funzione di for_each, vedere for_each.
Codice
// 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;
}
Riepilogo
Espressioni lambda è una tecnica di programmazione efficace e espressiva.Per ulteriori informazioni sulle parti e le proprietà di un'espressione lambda, vedere Sintassi delle espressioni lambda.Per informazioni su come utilizzare le espressioni lambda nei programmi, vedere Esempi di espressioni lambda.