Les expressions lambda són una característica poderosa i flexible del C++ que permeten definir funcions anònimes de manera concisa. Aquestes funcions poden ser utilitzades en llocs on es necessiten funcions curtes i temporals, com ara en funcions d'ordre superior, algoritmes de la Biblioteca de Plantilles Estàndard (STL), i més.
Contingut
Què és una Expressió Lambda?
Una expressió lambda és una funció anònima que es pot definir en línia dins del codi. Les lambdes són útils per a funcions curtes que no necessiten ser reutilitzades en altres llocs del programa.
Sintaxi de les Expressions Lambda
La sintaxi bàsica d'una expressió lambda en C++ és la següent:
- captures: Defineix les variables que la lambda captura del seu entorn.
- parameters: Els paràmetres de la funció lambda.
- return_type: El tipus de retorn de la funció lambda (opcional si es pot deduir automàticament).
- cos de la funció: El bloc de codi que defineix el comportament de la lambda.
Exemple Bàsic
#include <iostream>
int main() {
auto sum = [](int a, int b) -> int {
return a + b;
};
std::cout << "La suma de 3 i 4 és: " << sum(3, 4) << std::endl;
return 0;
}Captura de Variables
Les lambdes poden capturar variables del seu entorn de diverses maneres:
- Per valor (
[=]): Captura totes les variables per valor. - Per referència (
[&]): Captura totes les variables per referència. - Captura específica: Es poden capturar variables específiques per valor o referència.
Exemple de Captura
#include <iostream>
int main() {
int x = 10;
int y = 20;
auto add = [x, &y](int a) -> int {
y = y + a;
return x + y;
};
std::cout << "Resultat: " << add(5) << std::endl; // Resultat: 35
std::cout << "Valor de y: " << y << std::endl; // Valor de y: 25
return 0;
}Exemples Pràctics
Ús amb Algoritmes STL
Les lambdes són especialment útils amb els algoritmes de la STL, com std::sort.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {4, 2, 5, 1, 3};
std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a < b;
});
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl; // Sortida: 1 2 3 4 5
return 0;
}Lambda com a Funció de Callback
#include <iostream>
#include <vector>
#include <algorithm>
void applyFunction(const std::vector<int>& vec, const std::function<void(int)>& func) {
for (int n : vec) {
func(n);
}
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
applyFunction(vec, [](int n) {
std::cout << n * n << " ";
});
std::cout << std::endl; // Sortida: 1 4 9 16 25
return 0;
}Exercicis Pràctics
Exercici 1: Filtrar Elements
Escriu una funció que utilitzi una lambda per filtrar els elements d'un vector d'enters, retornant només els elements que són parells.
#include <iostream>
#include <vector>
#include <algorithm>
std::vector<int> filterEven(const std::vector<int>& vec) {
std::vector<int> result;
std::copy_if(vec.begin(), vec.end(), std::back_inserter(result), [](int n) {
return n % 2 == 0;
});
return result;
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> evenNumbers = filterEven(vec);
for (int n : evenNumbers) {
std::cout << n << " ";
}
std::cout << std::endl; // Sortida: 2 4 6 8 10
return 0;
}Exercici 2: Transformar Elements
Escriu una funció que utilitzi una lambda per transformar els elements d'un vector d'enters, multiplicant cada element per 3.
#include <iostream>
#include <vector>
#include <algorithm>
std::vector<int> transformTriple(const std::vector<int>& vec) {
std::vector<int> result(vec.size());
std::transform(vec.begin(), vec.end(), result.begin(), [](int n) {
return n * 3;
});
return result;
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> tripledNumbers = transformTriple(vec);
for (int n : tripledNumbers) {
std::cout << n << " ";
}
std::cout << std::endl; // Sortida: 3 6 9 12 15
return 0;
}Conclusió
Les expressions lambda són una eina poderosa en C++ que permeten definir funcions anònimes de manera concisa i flexible. Són especialment útils en combinació amb els algoritmes de la STL i per a funcions de callback. Amb la pràctica, les lambdes poden simplificar i fer més llegible el teu codi.
En el següent tema, explorarem el Multifil en C++, una altra característica avançada que permet executar múltiples fils de manera concurrent.
Curs de Programació en C++
Mòdul 1: Introducció al C++
- Introducció al C++
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Entrada i Sortida
Mòdul 2: Estructures de Control
Mòdul 3: Funcions
- Introducció a les Funcions
- Paràmetres de Funció i Tipus de Retorn
- Sobrecàrrega de Funcions
- Recursivitat
Mòdul 4: Arrays i Strings
Mòdul 5: Punteres i Referències
- Introducció als Punteres
- Aritmètica de Punteres
- Punteres i Arrays
- Referències
- Assignació Dinàmica de Memòria
Mòdul 6: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Constructors i Destructors
- Herència
- Polimorfisme
- Encapsulació i Abstracció
Mòdul 7: Temes Avançats
- Plantilles
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Biblioteca de Plantilles Estàndard (STL)
- Expressions Lambda
- Multifil
