Las expresiones lambda en C++ son una característica poderosa introducida en C++11 que permite definir funciones anónimas de manera concisa. Son útiles para operaciones que requieren funciones cortas y temporales, como las que se pasan a algoritmos de la Biblioteca Estándar de Plantillas (STL).
Conceptos Clave
-
Sintaxis Básica:
[captura](parametros) -> tipo_retorno { cuerpo }
- Captura: Define qué variables externas están disponibles dentro de la lambda.
- Parámetros: Lista de parámetros de la función.
- Tipo de Retorno: (Opcional) Especifica el tipo de retorno de la función.
- Cuerpo: El código que se ejecuta cuando se llama a la lambda.
-
Captura por Valor y por Referencia:
- Por Valor (
[=]
): Captura las variables externas por valor. - Por Referencia (
[&]
): Captura las variables externas por referencia.
- Por Valor (
-
Ejemplo de Uso:
auto lambda = [](int x, int y) -> int { return x + y; }; std::cout << lambda(2, 3); // Salida: 5
Ejemplos Prácticos
Ejemplo 1: Captura por Valor
#include <iostream> int main() { int a = 10; auto lambda = [=]() { std::cout << "Valor de a: " << a << std::endl; }; lambda(); // Salida: Valor de a: 10 return 0; }
Explicación: La lambda captura a
por valor, por lo que dentro de la lambda, a
es una copia de la variable externa.
Ejemplo 2: Captura por Referencia
#include <iostream> int main() { int a = 10; auto lambda = [&]() { a = 20; }; lambda(); std::cout << "Nuevo valor de a: " << a << std::endl; // Salida: Nuevo valor de a: 20 return 0; }
Explicación: La lambda captura a
por referencia, permitiendo modificar la variable externa a
.
Ejemplo 3: Uso en Algoritmos STL
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; std::for_each(vec.begin(), vec.end(), [](int &n) { n *= 2; }); for (int n : vec) { std::cout << n << " "; // Salida: 2 4 6 8 10 } return 0; }
Explicación: La lambda se pasa a std::for_each
para duplicar cada elemento del vector.
Ejercicios Prácticos
Ejercicio 1: Filtrar Números Pares
Escribe una lambda que filtre los números pares de un vector de enteros.
Código Inicial:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; std::vector<int> even_numbers; // Tu código aquí for (int n : even_numbers) { std::cout << n << " "; } return 0; }
Solución:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; std::vector<int> even_numbers; std::copy_if(vec.begin(), vec.end(), std::back_inserter(even_numbers), [](int n) { return n % 2 == 0; }); for (int n : even_numbers) { std::cout << n << " "; // Salida: 2 4 6 8 10 } return 0; }
Ejercicio 2: Ordenar una Lista de Pares
Escribe una lambda que ordene una lista de pares (int, int)
por el segundo elemento.
Código Inicial:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<std::pair<int, int>> vec = {{1, 4}, {2, 3}, {3, 2}, {4, 1}}; // Tu código aquí for (const auto &p : vec) { std::cout << "(" << p.first << ", " << p.second << ") "; } return 0; }
Solución:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<std::pair<int, int>> vec = {{1, 4}, {2, 3}, {3, 2}, {4, 1}}; std::sort(vec.begin(), vec.end(), [](const std::pair<int, int> &a, const std::pair<int, int> &b) { return a.second < b.second; }); for (const auto &p : vec) { std::cout << "(" << p.first << ", " << p.second << ") "; // Salida: (4, 1) (3, 2) (2, 3) (1, 4) } return 0; }
Conclusión
Las expresiones lambda en C++ son una herramienta poderosa para definir funciones anónimas de manera concisa y eficiente. Son especialmente útiles en combinación con algoritmos de la STL, permitiendo escribir código más limpio y legible. A través de los ejemplos y ejercicios, hemos explorado cómo capturar variables, modificar su comportamiento y aplicarlas en contextos prácticos.
En el siguiente tema, exploraremos el multihilo en C++, una técnica avanzada para ejecutar múltiples tareas simultáneamente, mejorando el rendimiento de nuestras aplicaciones.
Curso de Programación en C++
Módulo 1: Introducción a C++
- Introducción a C++
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Entrada y Salida
Módulo 2: Estructuras de Control
Módulo 3: Funciones
- Introducción a las Funciones
- Parámetros de Función y Tipos de Retorno
- Sobrecarga de Funciones
- Recursión
Módulo 4: Arreglos y Cadenas
- Introducción a los Arreglos
- Arreglos Multidimensionales
- Introducción a las Cadenas
- Manipulación de Cadenas
Módulo 5: Punteros y Referencias
- Introducción a los Punteros
- Aritmética de Punteros
- Punteros y Arreglos
- Referencias
- Asignación Dinámica de Memoria
Módulo 6: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Constructores y Destructores
- Herencia
- Polimorfismo
- Encapsulación y Abstracción
Módulo 7: Temas Avanzados
- Plantillas
- Manejo de Excepciones
- Entrada/Salida de Archivos
- Biblioteca Estándar de Plantillas (STL)
- Expresiones Lambda
- Multihilo