C++ lambda表达式的用法
lambda
表达式是 C++11 标准中非常重要的一个新特性,它用于定义匿名函数,使得代码更加灵活、简洁。lambda 表达式与普通函数类似,也有参数列表、返回值类型和函数体,只是它的定义方式更简洁,并且可以在函数内部定义。
lambda 表达式的语法格式如下所示:
[捕获列表](参数列表)->返回值类型 { 函数体 }
在上述语法格式中,参数列表、返回值类型、函数体的含义都与普通函数相同。如果 lambda 表达式不需要参数,并且函数没有返回值,则可以将()
、->
和返回值类型一起省略。捕获列表是 lambda 表达式的标识,编译器根据“[]”判断接下来的代码是否是 lambda 表达式。捕获列表能够捕获 lambda 表达式上下文中的变量,以供 lambda 表达式使用。
根据捕获规则,捕获列表有以下五种常用的捕获形式:
- []:空捕获,表示 lambda 表达式不捕获任何变量。
-
[var]:变量捕获,表示捕获局部变量 var。如果捕获多个变量,变量之间用
,
分隔。 - [&var]:引用捕获,表示以引用方式捕获局部变量 var。
- [=]:隐式捕获,表示捕获所有的局部变量。
- [&]:隐式引用捕获,表示以引用方式捕获所有的局部变量。
以上捕获方式还可以组合使用,通过组合,捕获列表可以实现更复杂的捕获功能,例如,[=,&a,&b] 表示以引用方式捕获变量 a 和变量 b,以值传递方式捕获其他所有变量。
示例
下面通过案例演示 lambda 表达式的使用,C++ 代码如下:#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { int num = 100; //lambda表达式 auto f = [num](int x)->int {return x + num; }; cout << f(10) << endl; //创建vector对象v vector<int> v = { 54,148,3,848,2,89 }; //调用for_each()函数遍历输出v容器中的元素 for_each(v.begin(), v.end(), [](auto n) {cout << n << " "; }); return 0; }运行结果:
110
54 148 3 848 2 89
- 第 9 行代码定义了一个 lambda 表达式,该 lambda 表达式有一个 int 类型的参数 x,返回值为 int 类型,并以值传递的方式捕获局部变量 num。在函数体内部返回 x 与 num 之和;
- 第 10 行代码通过变量 f 调用 lambda 表达式,lambda 表达式的调用方式与普通函数的调用方式相同,都是使用“()”运算符传入参数;
- 第 12~15 行代码创建了 vector 对象 v,并调用 for_each() 函数遍历对象 v,输出其中的元素。for_each() 函数的第三个参数是一个 lambda 表达式,该 lambda 表达式不捕获任何变量,它有一个 int 类型的参数 n(对象 v 中的元素),在函数体中输出 n 的值。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。