Compartir a través de


Ejemplos de expresiones lambda

Este tema contiene ejemplos de cómo utilizar expresiones lambda en los programas.Para obtener información general sobre las expresiones lambda, vea Expresiones lambda en C++.Para obtener más información sobre la estructura de una expresión lambda, vea Sintaxis de la expresión lambda.

En esta sección

Ejemplo: declarar expresiones lambda

Ejemplo: Expresiones lambda de llamada

Ejemplo: Expresiones lambda de anidamiento

Ejemplo: Funciones de orden superior lambda

Ejemplo: Utilizando una expresión lambda en un método

Ejemplo: Utilizar expresiones lambda con plantillas

Ejemplo: administrar excepciones

Ejemplo: Utilizar expresiones lambda con los tipos administrados

Ejemplo: declarar expresiones lambda

Dd293599.collapse_all(es-es,VS.110).gifDescripción

Porque se escribe una expresión lambda, puede asignarlo a una variable de auto o un objeto de function , como se muestra en el ejemplo siguiente:

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

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

Dd293599.collapse_all(es-es,VS.110).gifComentarios

Para obtener más información sobre la palabra clave de auto , vea palabra clave auto (tipo Deduction).Para obtener más información acerca de function class, vea function Class.

Aunque las expresiones lambda se declaran con mayor frecuencia en el cuerpo de un método o función, puede declararlos en cualquier parte donde se puede inicializar una variable.

Dd293599.collapse_all(es-es,VS.110).gifDescripción

El compilador de Visual C++ enlaza una expresión lambda a las variables capturadas cuando la expresión se declara en lugar de cuando se llama a la expresión.El ejemplo siguiente se muestra una expresión lambda que captura la variable local i por valor y la variable local j por referencia.Dado que la expresión lambda captura i por valor, la reasignación de i en el programa no afecta más adelante al resultado de la expresión.Sin embargo, porque la expresión lambda captura j por referencia, la reasignación de j afecta al resultado de la expresión.

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

47

Dd293599.collapse_all(es-es,VS.110).gifComentarios

[En esta sección]

Ejemplo: Expresiones lambda de llamada

Puede llamar a una expresión lambda directamente o pasarlos como argumento a algoritmos estándar de (STL) de la plantilla como find_if.

Dd293599.collapse_all(es-es,VS.110).gifDescripción

El ejemplo siguiente declara una expresión lambda que devuelve la suma de dos números enteros y llame a la expresión inmediatamente con argumentos 5 y 4:

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

9

Dd293599.collapse_all(es-es,VS.110).gifDescripción

El ejemplo siguiente se pasa una expresión lambda como argumento a la función de find_if .La expresión lambda devuelve true si el parámetro es un número par.

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

The first even number in the list is 42.

Dd293599.collapse_all(es-es,VS.110).gifComentarios

Para obtener más información sobre la función de find_if , vea find_if.Para obtener más información sobre las funciones de STL que realizan algoritmos, vea <algorithm>.

Dd293599.collapse_all(es-es,VS.110).gifDescripción

Puede invocar una expresión lambda asignada a la variable mediante el operador de llamada de función, operator().El ejemplo siguiente se asigna una expresión lambda a una variable de auto y después se utiliza el operador de llamada de función para invocar la expresión lambda:

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

33

Dd293599.collapse_all(es-es,VS.110).gifComentarios

Para obtener más información sobre el operador de llamada de función, vea Llamada a función (C++).

[En esta sección]

Ejemplo: Expresiones lambda de anidamiento

Dd293599.collapse_all(es-es,VS.110).gifDescripción

Puede anidar una expresión lambda en otra.El ejemplo siguiente se muestra una expresión lambda que contiene otra expresión lambda.La expresión lambda interna multiplica el argumento por 2 y devuelve el resultado.La expresión lambda externa llama a la expresión lambda interna con su argumento y agrega 3 al resultado.

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

13

Dd293599.collapse_all(es-es,VS.110).gifComentarios

En este ejemplo, [](int y) { return y * 2; } es la expresión lambda anidada.

[En esta sección]

Ejemplo: Funciones de orden superior lambda

Dd293599.collapse_all(es-es,VS.110).gifDescripción

Muchos lenguajes de programación admiten el concepto de una función de orden superior. Una función de orden superior es una expresión lambda que toma otra expresión lambda como argumento o que devuelve una expresión lambda.Puede utilizar la clase de function para permitir a la expresión lambda de C++. se comporte como una función de orden superior.El ejemplo siguiente se muestra una expresión lambda que devuelve un objeto de function y una expresión lambda que toma un objeto de function como argumento:

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

16

Dd293599.collapse_all(es-es,VS.110).gifComentarios

[En esta sección]

Ejemplo: Utilizando una expresión lambda en un método

Dd293599.collapse_all(es-es,VS.110).gifDescripción

Puede utilizar expresiones lambda en el cuerpo de un método.La expresión lambda puede tener acceso a cualquier método o miembro de datos que el método que se puede tener acceso.Puede capturar explícita o implícitamente el puntero de this para proporcionar acceso a los métodos y miembros de datos de la clase envolvente.

El ejemplo siguiente se muestra la clase de Scale , que encapsula un valor de escala.El método de ApplyScale usa una expresión lambda para imprimir el producto de cada elemento de un objeto de vector y el valor de escala.La expresión lambda explícitamente captura el puntero de this para poder tener acceso al miembro de _scale .

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

9
18
27

Dd293599.collapse_all(es-es,VS.110).gifComentarios

Puede utilizar el puntero de this explícitamente en un método, como se muestra en el ejemplo siguiente:

void ApplyScale(const vector<int>& v) const
{
   for_each(v.begin(), v.end(), 
      [this](int n) { cout << n * this->_scale << endl; });
}

También puede capturar el puntero de this implícitamente, como se muestra en el ejemplo siguiente:

void ApplyScale(const vector<int>& v) const
{
   for_each(v.begin(), v.end(), 
      [=](int n) { cout << n * _scale << endl; });
}

[En esta sección]

Ejemplo: Utilizar expresiones lambda con plantillas

Dd293599.collapse_all(es-es,VS.110).gifDescripción

Dado que se escriben las expresiones lambda, puede utilizarlas con las plantillas de C++.En el ejemplo siguiente se muestran las funciones negate_all y print_all.La función de negate_all aplica operator- unario a cada elemento del objeto de vector .La función de print_all imprime cada elemento en el objeto de vector en la consola.

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

-34
43
-56

Dd293599.collapse_all(es-es,VS.110).gifComentarios

Para obtener más información sobre las plantillas de C++, vea Plantillas.

[En esta sección]

Ejemplo: administrar excepciones

Dd293599.collapse_all(es-es,VS.110).gifDescripción

El cuerpo de una expresión lambda sigue las reglas para el control de excepciones estructurado (SEH) y el control de excepciones de C++.Puede administrar una excepción en el cuerpo de una expresión lambda o diferir control de excepciones en el ámbito de inclusión.El ejemplo siguiente utiliza la función de for_each y una expresión lambda para rellenar un objeto de vector con los valores de otro.Utiliza un bloque de try/decatch para controlar el acceso no válido al primer vector.

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

Caught 'invalid vector<T> subscript'.

Dd293599.collapse_all(es-es,VS.110).gifComentarios

Para obtener más información acerca del control de excepciones, vea Control de excepciones en Visual C++.

[En esta sección]

Ejemplo: Utilizar expresiones lambda con los tipos administrados

Dd293599.collapse_all(es-es,VS.110).gifDescripción

La cláusula catch de una expresión lambda no puede contener una variable con un tipo administrado.Sin embargo, puede pasar un argumento con un tipo administrado a la lista de parámetros de una expresión lambda.El ejemplo siguiente contiene una expresión lambda que captura ch variable no administrada local por valor y toma un objeto de System.String como parámetro:

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

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

Dd293599.collapse_all(es-es,VS.110).gifOutput

Hello!

Dd293599.collapse_all(es-es,VS.110).gifComentarios

Puede utilizar también expresiones lambda con la biblioteca de STL/CLR.Para obtener más información sobre STL/CLR, vea referencia de la biblioteca de STL/CLR.

[En esta sección]

Vea también

Referencia

Expresiones lambda en C++

Sintaxis de la expresión lambda

palabra clave auto (tipo Deduction)

function Class

find_if

<algorithm>

Llamada a función (C++)

Control de excepciones en Visual C++

Otros recursos

Plantillas

referencia de la biblioteca de STL/CLR