Expressions lambda en C++
Dans Visual C++, un lambda expression- accessible à mesure qu'un lambda- estsimilaire à une fonction anonyme qui met à jour l'état et peut accéder aux variables qui sont disponibles dans la portée englobante.Cet article définit les expressions lambda, les compare à d'autres techniques de programmation, décrit leurs avantages, et fournit un exemple de base.
À propos de Lambdas
De nombreux langages de programmation prennent en charge le concept d'une fonction anonyme, qui est une fonction dont le corps, mais n'ont pas de nom.Un lambda est une technique de programmation qui est liée aux fonctions anonymes.Un lambda définit implicitement une classe d'objets de fonction et crée un objet de fonction avec de ce type de classe.Pour plus d'informations sur les objets de fonction, consultez Objets de fonction.
Important
Les expressions lambda ne sont pas pris en charge des entités gérées par (CLR) suivantes du common langage runtime : ref class, ref struct, value class, ou value struct.
Objets de fonction VS. Lambdas
Lorsque vous écrivez le code, utilisez probablement des pointeurs fonction et les objets de fonction pour résoudre les problèmes et exécuter des calculs, surtout lorsque vous utilisez Conteneurs STL.Les pointeurs fonction et les objets de fonction présentent des avantages et inconvénient- pour l'exemple, les pointeurs fonction sont la charge mémoire syntaxique minimale mais ne conservent pas l'état dans une portée, et les objets de fonction peuvent mettre à jour l'état mais que la charge mémoire syntaxique d'une définition de classe.
Un lambda combine les avantages des pointeurs fonction et les objets de fonction et évite les inconvénients.Comme les objets d'une fonction lambda, un est flexible et peut mettre à jour l'état, mais contrairement à un objet de fonction, sa syntaxe compacte ne requiert pas une définition de classe.En utilisant des expressions lambda, vous pouvez écrire le code qui a des erreurs encombrantes et moins sujette moins que le code d'un objet équivalent de fonction.
Les exemples suivants comparent l'utilisation d'un lambda à l'utilisation d'un objet de fonction.Le premier exemple utilise un lambda pour imprimer à la console si chaque élément dans un objet d' vector est égal ou étrange.Le deuxième exemple utilise un objet de fonction pour accomplir la même tâche.
Exemple 1 : À l'aide d'un lambda
Cet exemple utilise un lambda incorporé dans l'appel de fonction d' for_each pour imprimer à la console si chaque élément dans un objet d' vector est égal ou étrange.
Code
// 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;
}
Sortie
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.
Commentaires
Dans l'exemple, le troisième argument à la fonction d' for_each est un lambda.La partie d' [&evenCount] spécifie la clause de capture de l'expression, (int n) spécifie la liste de paramètres, et la partie restante spécifie le corps de l'expression.
Exemple 2 : À l'aide d'un objet de fonction
Quelquefois un lambda est trop complexe pour étendre beaucoup plus loin que l'exemple précédent.L'exemple suivant utilise un objet de fonction au lieu d'un lambda, ainsi que la fonction d' for_each, pour produire les mêmes résultats que l'exemple 1.Les deux exemples indiquent le nombre pair de chiffres dans un objet d' vector .Pour mettre à jour l'état de l'exécution, la classe d' FunctorClass stocke la variable d' m_evenCount par référence comme variable membre.Pour exécuter l'opération, FunctorClass implémente l'opérateur d'appel de fonction, operator().Le compilateur Visual C++ génère du code qui est comparable en taille et performances au code de lambda dans l'exemple 1.Pour un problème de base choix celui dans cet article, la conception plus simple de lambda est probablement meilleure que la conception de les fonctions objet.Toutefois, si vous pensez que la fonctionnalité peut nécessiter l'expansion significative dans le futur, puis utilisez une conception d'objet de fonction afin que la maintenance du code soit plus facile.
Pour plus d'informations sur le operator(), consultez Appel de fonction (C++).Pour plus d'informations sur la fonction d' for_each, consultez for_each.
Code
// 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;
}
Résumé
Les expressions lambda sont une technique de programmation puissante et expressive.Pour découvrir les parties et les propriétés d'un lambda, consultez Syntaxe d'expression lambda.Pour savoir comment utiliser des expressions lambda dans vos programmes, consultez l' Exemples d'expressions lambda.