C++编程基础: 18. Lambda表达式
2025-04-19 06:22:32
本系列文章是配合我发布的《C++编程基础》系列视频教程的知识点总结和补充。这一节我们来讲讲Lambda表达式。
Lambda表达式常用格式
使用Lambda表达式可以定义匿名函数,它的常用格式如下:
[捕获列表] (参数列表) {函数体}
例如定义打印一个整型参数的匿名函数可以这样编写和调用:
[](int x){std::cout<<x<<std::endl;}(9);
输出结果:
9
另外,如果明确给出返回值类型,可以用“-> 返回值类型”的格式插入尾置返回类型 :
[捕获列表] (参数列表) -> 返回值类型 {函数体}
例如可以将比较两个整数返回最大值的函数按如下方式编写和调用:
int maxXY = 0;
= [](int x, int y)->int{
maxXY if(x>y){
return x;
}else{
return y;
}
}(23,172);
std::cout<<"max:"<<maxXY<<std::endl;
输出结果:
maxXY:172
[捕获列表]
的用法
以下给出常用的捕获列表格式:
[]
:不捕获外部的任何变量
[=]
:以赋值的方式捕获所有的外部变量
[&]
:以引用的方式捕获所有的外部变量
[this]
:捕获当前类的this指针
另外,还可以特殊指定具体变量使用何种方式捕获,例如:
[x, &y]
:变量x以赋值的方式被捕获,
变量y以引用的方式被捕获
[&, x]
:以引用的方式捕获所有的外部变量,除了变量x用赋值的方式
例如可以将比较两个整数返回最小值的函数按如下方式编写和调用(注意,这两个整数的值都来自匿名函数之外的变量):
int x = 36, y = 13;
int minXY = 0;
= [x, y]()->int{
minXY if(x<y){
return x;
}else{
return y;
}
}();
std::cout<<"minXY:"<<minXY<<std::endl;
输出结果:
13
如果我们想在匿名函数中改变变量x,y的值,可以在捕获时用引用的方式[&x, &y]:
int x = 36, y = 13;
int minXY = 0;
= [&x, &y]()->int{
minXY =21;
x=58;
yif(x<y){
return x;
}else{
return y;
}
}();
std::cout<<"minXY:"<<minXY<<std::endl;
std::cout<<"x:"<<x<<std::endl;
std::cout<<"y:"<<y<<std::endl;
输出结果:
minXY:21
x:21
y:58
默认情况下,用赋值方式捕获的外部变量在匿名函数里的拷贝是不允许修改的,如果想在匿名函数里修改它们的值,需要在函数体大括号前使用关键字mutable:
int x = 36, y = 13;
int minXY = 0;
= [x, y]()mutable{
minXY =21;
x=58;
yif(x<y){
return x;
}else{
return y;
}
}();
std::cout<<"minXY:"<<minXY<<std::endl;
std::cout<<"x:"<<x<<std::endl;
std::cout<<"y:"<<y<<std::endl;
输出结果:
minXY:21
x:36
y:13
注意,这种方式与直接使用引用方式捕获不同,它并不会改变外部变量实际的值。