行业知识
【C++】C++11——lambda表达式
2026-11-05 09:14:26
来源:互联网转载
文章目录
- 一、Lambda表达式引入
- 二、Lambda表达式语法
- 三、Lambda表达式交换两个值
- 四、Lambda表达式底层原理
一、Lambda表达式引入
我们之前都是通过函数指针、仿函数的方式可以像函数使用的对象,在C++11之后,就有了Lambda表达式
struct Goods{ string _name; double _price;};struct Compare{ bool operator()(const Goods& gl, const Goods& gr) { return gl._price g2._price; });//大于时降序return 0;}此时,每次调用sort函数我们只需要传入一个lambda表达式即可指明比较方式,大大提高了代码的可阅读性。下面,我们进入的环节是Lambda表达式的语法。
二、Lambda表达式语法
上面的代码就是用Lambda表达式解决的,我们清楚地可以看出Lambda表达式底层是匿名函数。
Lambda表达式的格式:
[capture-list] (parameters) mutable -> return-type { statement }Lambda表达式格式各项说明:
[capture-list] : 捕捉列表(必写项),该列表总是出现在lambda函数的开始位置,编译器根据**[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda**函数使用。
(parameters):参数列表(非必写项)。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略
mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。一般不需要
->returntype:返回值类型(非必写项)。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导
{statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。
除了捕捉列表外,Lambda表达式其他的地方和普通函数大致相同,Lambda表达式的参数列表和返回值可有可无,但是捕捉列表和函数体是必须写,不可省略的,所以最简单的Lambda表达式如下:
int main(){[]{}; return 0;}在举个例子:两个int对象相加的Lambda表达式:
int main(){//进行int对象相加的Lambda表达式 //Lambda——可调用对象//[](int x, int y)->bool {return x + y; };auto compare = [](int x, int y) {return x + y; };cout