En C++ una función lambda es una sintaxis compacta para definir funciones anónimas, sin necesidad de declararla de forma explícita como una función tradicional.
Estas funciones son especialmente útiles para operaciones simples y rápidas. Por ejemplo, cuando se trata de operaciones en colecciones, como filtrado, mapeo o reducción.
Si quieres aprender más sobre funciones Lambda
consulta el Curso de Introducción a la Programación leer más
Sintaxis de las funciones lambda
La sintaxis básica de una función lambda en C++ es la siguiente:
[captura](parametros) -> tipo_retorno { cuerpo }- Captura: Lista de variables del entorno que la lambda puede usar.
 - Parámetros: Lista de parámetros de entrada, separados por comas si hay más de uno.
 - Tipo de retorno: Tipo de valor que devuelve la lambda, opcional si el tipo es deducible.
 - Cuerpo: El código que se ejecuta cuando se invoca la lambda.
 
Ejemplo básico
Aquí tienes un ejemplo básico de una función lambda que suma dos números:
#include <iostream>
int main() {
    auto sumar = [](int x, int y) -> int {
        return x + y;
    };
    std::cout << "Suma: " << sumar(5, 3) << std::endl; // Output: 8
    return 0;
}En este ejemplo,
- La función lambda 
sumartoma dos parámetrosxey, y devuelve su suma. - La palabra clave 
autose usa para deducir el tipo de la lambda, y-> intespecifica el tipo de retorno. 
Captura de variables
Las funciones lambda pueden capturar variables del contexto en el que se definen. Hay diferentes modos de captura:
- Por valor (
=): Captura una copia de las variables. - Por referencia (
&): Captura las variables por referencia, permitiendo modificar su valor. - Mixta: Combinación de capturas por valor y por referencia.
 
#include <iostream>
int main() {
    int valor = 10;
    auto lambda = [valor]() {
        std::cout << "Valor: " << valor << std::endl;
    };
    lambda(); // Output: Valor: 10
    return 0;
}#include <iostream>
int main() {
    int valor = 10;
    auto lambda = [&valor]() {
        valor++;
        std::cout << "Valor: " << valor << std::endl;
    };
    lambda(); // Output: Valor: 11
    std::cout << "Valor después de la lambda: " << valor << std::endl; // Output: Valor después de la lambda: 11
    return 0;
}Uso en funciones de orden superior
Las funciones lambda pueden ser pasadas como argumentos a otras funciones que aceptan funciones o objetos funcionales.
Ejemplo con std::function:
#include <iostream>
#include <functional>
void Ejecutar(std::function<void()> func) {
    func();
}
int main() {
    auto mensaje = []() {
        std::cout << "Hola desde una función lambda" << std::endl;
    };
    Ejecutar(mensaje);
    return 0;
}Lambdas captura de this
Las lambdas también pueden capturar this para acceder a los miembros de la clase desde dentro de la lambda.
#include <iostream>
class MiClase {
private:
    int valor;
public:
    MiClase(int v) : valor(v) {}
    void imprimirValor() {
        auto lambda = [this]() {
            std::cout << "Valor: " << valor << std::endl;
        };
        lambda();
    }
};
int main() {
    MiClase obj(42);
    obj.imprimirValor(); // Imprime 42
    return 0;
}En este ejemplo, la lambda captura this para acceder al miembro valor de la clase MiClase.
Lambdas genericas
Desde C++14 las lambdas pueden ser genéricas, lo que permite trabajar con diferentes tipos de datos.
#include <iostream>
int main() {
    auto imprimir = [](auto dato) {
        std::cout << dato << std::endl;
    };
    imprimir(5);        // Imprime un entero
    imprimir(3.14);     // Imprime un flotante
    imprimir("Hola");   // Imprime una cadena de texto
    return 0;
}En este ejemplo, la lambda imprimir es capaz de manejar diferentes tipos de datos gracias a su naturaleza genérica.
Ejemplos prácticos
Ordenar una colección
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    std::vector<int> numeros = {5, 2, 9, 1, 5, 6};
    // Ordenar usando una función lambda
    std::sort(numeros.begin(), numeros.end(), [](int a, int b) {
        return a < b;
    });
    for (int num : numeros) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}Filtrar una colección
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    std::vector<int> numeros = {1, 2, 3, 4, 5, 6};
    // Filtrar pares
    std::vector<int> pares;
    std::copy_if(numeros.begin(), numeros.end(), std::back_inserter(pares), [](int num) {
        return num % 2 == 0;
    });
    for (int num : pares) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}Uso en std::for_each
La función lambda es muy útil con std::for_each para aplicar una acción a cada elemento de una colección.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    std::vector<int> numeros = {1, 2, 3, 4, 5};
    // Aplicar una función lambda a cada elemento
    std::for_each(numeros.begin(), numeros.end(), [](int num) {
        std::cout << num << " ";
    });
    std::cout << std::endl;
    return 0;
}