Directorio de artículos
comprensión
Las expresiones Lambda también se denominan funciones anónimas. Ya existen en C # y Python, y C ++ 11 solo se inició.
Formato de declaración:
[lista de captura] (lista de parámetros) excepción
mutable- > tipo de retorno {cuerpo de la función}其中 :
- lista de captura: captura una lista de variables externas
- lista de parámetros: lista de parámetros formales
- Indicador mutable: si modificar la variable capturada
- excepción: configuración de excepción
- tipo de retorno: tipo de retorno
- cuerpo de función: cuerpo de función
Otros formatos:
- [lista de captura] (lista de parámetros) -> tipo de retorno {cuerpo de la función}
- [lista de captura] (lista de parámetros) {cuerpo de la función} // El tipo de retorno se puede adivinar basándose en el retorno, si no se adivina el tipo de retorno, es nulo
- [lista de captura] {cuerpo de la función} // Similar a una función sin parámetros
Primer intento
(Usado por orden):
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a < b;
}
int main()
{
vector<int> myvec{ 3, 2, 5, 7, 3, 2 };
vector<int> lbvec(myvec);
sort(myvec.begin(), myvec.end(), cmp); // 旧式做法
cout << "predicate function:" << endl;
for (int it : myvec)
cout << it << ' ';
cout << endl;
sort(lbvec.begin(), lbvec.end(), [](int a, int b) -> bool { return a < b; }); // Lambda表达式
cout << "lambda expression:" << endl;
for (int it : lbvec)
cout << it << ' ';
}
Diferentes formas de captura:
Captura de valor
El valor no se puede cambiar después de la captura ; el valor de la variable capturada se pasa a través de la copia del valor cuando se crea la expresión Lambda, por lo que las modificaciones posteriores a la variable no afectarán el valor en la expresión Lambda .
#include <iostream>
using namespace std;
int main()
{
int a = 123;
auto f = [a] { cout << a << endl; };//不能改变lambda里面的a值
a = 321;
f(); // 输出:123
return 0;
}
Captura de referencia
Puede cambiar su valor después de la captura y, al mismo tiempo, modificar el valor capturado más tarde también lo afectará
#include <iostream>
using namespace std;
int main()
{
int a = 123;
auto f = [&a] { cout << a << endl; };
a = 321;
f(); // 输出:321
}
Captura implícita:
El compilador infiere qué variables deben capturarse basándose en el código del cuerpo de la función. Este método se denomina captura implícita. Hay dos formas de captura implícita, a saber [=] y [&]. [=] significa capturar variables externas mediante captura de valor, [&] significa capturar variables externas mediante captura de referencia.
Captura de valor implícita:
#include <iostream>
using namespace std;
int main()
{
int a = 123;
auto f = [=] { cout << a << endl; }; // 隐式值捕获
f(); // 输出:123
}
Captura de referencia implícita:
int main()
{
int a = 123;
auto f = [&] { cout << a << endl; }; // 隐式引用捕获
a = 321;
f(); // 输出:321
}
mutable: puede modificar el valor capturado por el valor:
#include <iostream>
using namespace std;
int main()
{
int a = 123;
auto f = [a]()mutable { cout << ++a; }; // 不会报错
cout << a << endl; // 输出:123,值捕获,不影响后面的值
f(); // 输出:124
}