C++ lambda 表达式/函数 一. 简介 lambda 可以方便地定义和创建匿名函数。 二. 语法 [capture list] (params list) mutable exception- return type { function body } 各项具体含义如下 capture list:捕获外部变量列
C++ lambda 表达式/函数
一. 简介
lambda 可以方便地定义和创建匿名函数。
二. 语法
[capture list] (params list) mutable exception-> return type { function body }
各项具体含义如下
- capture list:捕获外部变量列表
- params list:形参列表 (可省略)
- mutable指示符:用来说用是否可以修改捕获的变量 (可省略)
- exception:异常设定 (可省略)
- return type:返回类型 (可省略,如省略则自动从函数体中判断返回类型,return后的值。如果没有则返回void)
- function body:函数体
1. 捕获外部变量
通过在最前面的方括号中输入一些特殊符号,明确指出哪些外部变量可以被lambda函数捕获。
(1) 值捕获[变量名]
函数体内不能改变捕获变量的值,否则会引起编译错误。相当于函数参数中的值传递,会对值进行一个拷贝。
int main() { int a = 123; auto f = [a] { cout << a << endl; }; a = 321; f(); // 输出:123 }
(2) 引用捕获[&变量名]
相当于函数参数中的引用传递,不会做拷贝,其值会随外部的变量改变而改变。在函数体内可以对变量进行修改。
int main() { int a = 123; auto f = [&a] {
a += 1;
cout << a << endl; }; a += 1; f(); // 输出:125 }
(3) 隐式捕获 [=] [&]
[] 中不写明变量名,具体捕获哪个变量有函数体内的语句自动判断。也有两种捕获方式:
[=]:值捕获所有外部变量,同(1)值捕获
[&]: 引用捕获所有外部变量,同(2)引用捕获
(4) 混合方式,以逗号分离不同的方式
- [] : 不捕获任何变量
- [变量名,变量名]: 指定捕获多个变量
- [this]: 以值的形式捕获this指针
- [=,&x]: 以值捕获的方式捕获所有变量,对x进行引用捕获
- [&,=x]: 以引用方式捕获所有变量,对x进行值捕获
(5) 关键字,修改值捕获变量,mutable
如果加mutable关键字,则表明参数的括号()不能省
int main() { int a = 123; auto f = [a]()mutable { cout << ++a; }; // 不会报错 cout << a << endl; // 输出:123 f(); // 输出:124 }
2. 形参列表
- 不能有默认参数,因为没有意义
- 所有参数必须有参数名,因为一定会使用,不然没意义
- 不支持可变参数
二. 示例
1. 作为stl算法的输入:
vector<int> myvec{ 3, 2, 5, 7, 3, 2 }; sort(myvec.begin(), myvec.end(), [](int a, int b) -> bool { return a < b; }); // Lambda表达式
16:25:40