Compartir a través de


Expresiones lambda en C++

En Visual C++, una expresión lambda expresión- consultó a como a lambda- es como una función anónima que mantiene el estado y puede tener acceso a variables disponibles al ámbito de inclusión.Este artículo define cuáles son las expresiones lambda, los compara con otras técnicas de programación, describe sus ventajas, y proporciona un ejemplo básico.

Sobre Lambdas

Muchos lenguajes de programación admiten el concepto de una función anónima, que es una función que tiene un cuerpo, pero no tiene un nombre.Una expresión lambda es una técnica de programación relacionada con las funciones anónimas.Una expresión lambda define implícitamente una clase de objeto de función y crea un objeto de función de ese tipo de clase.Para obtener más información sobre los objetos de función, vea Objetos de función.

Nota importanteImportante

Lambdas no se admite en las entidades administradas (CLR) siguientes de Common Language Runtime: ref class, ref struct, value class, o value struct.

Objetos de función VS. Lambdas

Cuando se escribe código, utilice probablemente punteros a función y objetos de función para solucionar problemas y realizar cálculos, sobre todo cuando se usa Algoritmos de STL.Los punteros a función y los objetos de función tienen ventajas y desventaja- para el ejemplo, los punteros a función tienen sobrecarga sintáctica mínima pero no mantienen el estado dentro de un ámbito, y los objetos de función pueden mantener el estado pero requerir la sobrecarga sintáctica de una definición de clase.

Una expresión lambda combina las ventajas de punteros a función y los objetos de función y evita las desventajas.Como objetos de una función, una expresión lambda es flexible y puede mantener el estado pero, a diferencia de un objeto de función, su sintaxis compacta no requiere una definición de clase.Mediante las expresiones lambda, puede escribir código que es errores menos incómodos y menos propenso que el código para un objeto equivalente de la función.

Los ejemplos siguientes se compara el uso de una expresión lambda al uso de un objeto de función.El primer ejemplo utiliza una expresión lambda para imprimir en la consola si cada elemento de un objeto de vector es par o impar.El segundo ejemplo se usa un objeto de función para realizar la misma tarea.

Ejemplo 1: Utilizando una expresión lambda

Este ejemplo utiliza una expresión lambda que se inserte en la llamada de función for_each para imprimir en la consola si cada elemento de un objeto de vector es par o impar.

Dd293608.collapse_all(es-es,VS.110).gifCódigo

// 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(es-es,VS.110).gifOutput

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(es-es,VS.110).gifComentarios

En el ejemplo, el tercer argumento a la función de for_each es una expresión lambda.La parte de [&evenCount] especifica la cláusula catch de la expresión, (int n) especifica la lista de parámetros, y la parte restante especifica el cuerpo de la expresión.

Ejemplo 2: Utilizando un objeto de función

Una expresión lambda sería a veces demasiado difícil de controlar extender mucho más allá del ejemplo anterior.El ejemplo siguiente se utiliza un objeto de función en lugar de una expresión lambda, junto con la función de for_each, para generar los mismos resultados que en el ejemplo 1.Ambos ejemplos almacena el recuento de números pares de un objeto de vector.Para mantener el estado de la operación, la clase de FunctorClass almacena la variable de m_evenCount por referencia como variable miembro.Para realizar la operación, FunctorClass implementa el operador de llamada de función, operator().El compilador de Visual C++ genera código que es comparable de tamaño y rendimiento al código lambda en el ejemplo 1.Para un problema fundamental guste de en este caso, el diseño más simple lambda probablemente mejor que el diseño del función- objeto.Sin embargo, si desea que la funcionalidad podría requerir la extensión coherente en el futuro, utilice un objeto de función diseñar de modo que el mantenimiento del código es más fácil.

Para obtener más información acerca de operator(), vea Llamada a función (C++).Para obtener más información sobre la función de for_each, vea for_each.

Dd293608.collapse_all(es-es,VS.110).gifCódigo

// 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;
}

Resumen

Lambdas es una técnica de programación eficaz y expresiva.Para obtener información sobre las partes y las propiedades de una expresión lambda, vea Sintaxis de la expresión lambda.Para obtener información sobre cómo usar lambdas en programas, vea Ejemplos de expresiones lambda.

Vea también

Referencia

Llamada a función (C++)

for_each

Conceptos

Objetos de función

Otros recursos

Referencia del lenguaje C++