Comprensión de C ++: expresiones Lambda de C ++ 11

comprensión

Link de referencia:

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
}

Supongo que te gusta

Origin blog.csdn.net/QLeelq/article/details/111059206
Recomendado
Clasificación