C++11——lambda表达式

lambda表达式与函数对象

lambda表达式是C++11中引进的一种新语法,其在大部分情况下可以取代函数对象的使用。

函数对象(仿函数)

函数对象,又称为仿函数,函数对象是一个可以像函数一样使用的对象,其原理是在类中重载了operator()运算符的一个类对象,使得其用法与函数的使用相似。

struct Greater
{
	bool operator()(int x, int y)
	{
		return x > y;
	}
};

在C++头文件<algorithm>中所包含的sort排序算法中,我们常常会使用到仿函数的使用,来确定sort排序的次序。

不足之处:

仿函数每次为了实现一个algorithm算法都需要重新去写一个类,重载operator(),如果每次比较的逻辑不一样,需要去实现多个类,这是十分麻烦的。而大部分

lambda表达式语法

相比较仿函数,在使用方式上,lambda表达式与仿函数是一样的,但lambda表达式的使用更加简洁,对于要实现多种比较方式的情况下,也不需要去想函数类一样去定义多个函数类。

lambda表达式书写格式[捕捉列表] (参数) mutable -> 返回值类型 { 函数体 }

 lambda表达式各部分说明:

  1. [捕捉列表] : 编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数的实现使用,各个捕捉的参数之间用逗号隔开
  2. (参数列表):与普通函数的参数列表一致,如果不需要参数传递,可以连同()一起省略,但不建议省略。
  3. mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用mutable修饰符时,参数列表不可省略。
  4. ->返回值类型:声明函数的返回值类型,没有返回值时可省略返回值类型明确情况下,也可省略,由编译器对返回类型进行推导,但不建议省略。
  5. {函数体}:函数体与普通函数一样,用于函数的实现,最后返回对应类型返回值,函数体中可以直接使用所有捕获到的变量与参数列表的值

lambda表达式的注意事项

lambda表达式作为函数使用

lambda表达式实际上可以作为函数使用,但是由于其没有名称,不能够直接调用,但可以通过auto + 名称 的形式等效于给lambda表达式取了一个名称,使用lambda表达式可以被作为函数调用。

捕捉列表

[=]:表示对lambda表达式同作用域的全部变量进行值捕捉

[&]:表示对lambda表达式同作用域的全部变量进行引用捕捉

 捕捉列表中的变量值不能重复捕捉,只能捕捉一次,否则编译器会报错

 mutable

mutable的使用与否影响着函数体,默认未使用mutable时,lambda函数默认为const函数,使用捕捉列表中的值时不允许被改变。

 使用mutable可以取消lambda表达式函数的常性,使得捕捉列表中的值可以被修改,但是还需要注意的是,只有捕捉列表中的引用捕捉的值改变会同步,值捕捉的只是作为形参,并不会因为函数体内做出的修改而发生改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值