zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【C++】第20篇 超详细讲解 lambda 表达式

C++ 详细 20 讲解 表达式 lambda
2023-09-14 09:14:31 时间

目录

1、lambda 表达式定义

2、函数定义参数 

2.1 [] 不捕获任何变量

 2.2 [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用

 2.3 [=] 捕获外部所有变量,并作为副本在函数中使用

 2.4 = & 混合使用

 2.5 按某个变量捕获

 3、修饰符:mutable


1、lambda 表达式定义

在 C++ 11 标准中引入 lambda 表达式,用于定义创建匿名函数的对象。

在需要的时间和地点实现功能的闭包,方便快捷。

表达式定义类型:

[函数定义参数](函数参数)修饰符 -> 返回值类型{函数体; };

    auto f = [](int num) -> int {return num + 3; };
    auto numB = [](int num) -> int {return num + 10; };

 例如:

#include <iostream>

using namespace std;

int main()
{
    auto f = [](int num) -> int {return num + 3; };
    cout << f(5) << endl;
    return 0;
}

2、函数定义参数 

2.1 [] 不捕获任何变量

#include <iostream>

using namespace std;

// 定义全局变量
static int globalVarA = 20;

int main()
{
    // [] 不捕获任何变量
    // 全局变量可以在lambda函数体中使用
    auto f = [](int num) -> int {return num + 3; };
    auto numB = [](int num) -> int {return globalVarA + num; };
    cout << f(5) << "\n" << numB(10) << endl;
    return 0;
}

 2.2 [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用

按引用使用。

#include <iostream>

using namespace std;

int main()
{
    // [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用
    int fanA = 100;

    // 在函数体中可以使用修改 fanA
    auto numC = [&](int num) -> int {fanA = 200; return fanA + num; };
    cout << numC(20) << "\n" << "fanA = " << fanA <<endl;

}

 2.3 [=] 捕获外部所有变量,并作为副本在函数中使用

按值捕获。 

#include <iostream>

using namespace std;

int main()
{
   // [=] 捕获外部所有变量,并作为副本在函数中使用
   // 按值捕获
   int numA = 1000;

   // 在lambda函数体中不能操作 numA,例如numA++ 或 numA = 2000。
   auto f = [=](int num) -> int {return numA + num; };
   cout << "numA = " << numA << "\n" << f(1000) << endl;

}

 2.4 = & 混合使用

#include <iostream>

using namespace std;

int main()
{
   // = & 混合使用
   int numA = 100;
   int numC = 200;

   // 在lambda表达式函数体中,= 表示可以使用外部作用域所有变量,&numA 表示可以修改其值,其余不可以修改。
   auto f = [=, &numA](int num) -> int {numA++; return num + numA + numC; };
   cout << numA << endl << numC << endl << f(100) << endl;

   return 0;
}

 2.5 按某个变量捕获

#include <iostream>

using namespace std;

int main()
{

    // 按变量捕获
    int numA = 1000;

    auto f = [numA]() -> int {return numA; };
    cout << f() << endl;

   return 0;
}

 3、修饰符:mutable

    int numA = 100;
    auto f1 = [numA]() -> void {numA++;cout << numA << endl; };
    f1();

使用参数值传递的时候,在 lambda 函数体内部不可以修改其值。

mutable: 使用参数值传递的时候,在lambda函数体内部不可以修改其值,可以通过添加修饰符mutable。

#include <iostream>

using namespace std;

int main()
{
    // 修饰符
    // mutable: 使用参数值传递的时候,在lambda函数体内部不可以修改其值,可以通过添加修饰符mutable。
    int numA = 100;

    auto f2 = [numA]() mutable {numA++; cout << numA << endl; };
    f2();

    return 0;
}

 

  • exception:exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。