当我给面试官讲了lambda表达式...........

概念lambda表达式实际上是一个匿名类的成员函数,该类由编译器为lambda创建,该函数被隐式地定义为内联。因此,调用lambda表达式相当于直接调用它的operator()函数,这个函数可以被编译器内联优化(建议)。例如快速排序算法,S

当我给面试官讲了lambda表达式...........

概念

lambda表达式实际上是一个匿名类的成员函数,该类由编译器为lambda创建,该函数被隐式地定义为内联。因此,调用lambda表达式相当于直接调用它的operator()函数,这个函数可以被编译器内联优化(建议)。

例如快速排序算法,STL允许用户自定义比较方式,在C++11之前,通常使用仿函数实现。但是代码一旦很长,使用之处和仿函数实现的地方相隔甚远,而且如果仿函数的命名不规范,很容易造成使用上的困难。

用法

C++11的lambda表达式是一种允许内联函数的特性,它可以用于不需要重用和命名的代码片段。lambda表达式的一般形式是:

代码语言:javascript代码运行次数:0运行复制
[capture](parameters) mutable -> return_type { function_body }

接下来我们介绍一下不同部分:

[captureclause]:捕捉列表。该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。

代码语言:javascript代码运行次数:0运行复制
    - []:表示不捕获任何外部变量
    - [=]:以传值的方式捕获外部变量
    - [&]:以传引用的方式捕获外部变量
    - [this]:捕获外部的this指针
    - [=,&a]:以传值的方式捕获外部变量,但是以传引用的方式捕获变量a
    - [a,b]:以值传递的方式捕获外部变量a和b
    - [a,&b]:a以值传递的方式捕获,b以引用的方式捕获

(parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。

mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。

->return-type:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可以省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

{statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

示例

代码语言:javascript代码运行次数:0运行复制
int main()
{
	auto func = []()->void {cout << "hello world"<<endl; };
	func();
}

如下:

其实,lambdo的本质就是重载了()

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-10-08,如有侵权请联系 cloudcommunity@tencent 删除lambda变量编译器函数排序算法

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754966711a5222630.html

相关推荐

  • 当我给面试官讲了lambda表达式...........

    概念lambda表达式实际上是一个匿名类的成员函数,该类由编译器为lambda创建,该函数被隐式地定义为内联。因此,调用lambda表达式相当于直接调用它的operator()函数,这个函数可以被编译器内联优化(建议)。例如快速排序算法,S

    1月前
    190

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信