C++11新特性之lambda表达式

一、lambda表达式的优点

lambda是c++11非常重要也是最常用的特性之一,他有以下优点:

  • 就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或函数对象。
  • lambda是一个匿名的内联函数
  • 简洁:避免了代码膨胀和功能分散,让开发更加高效。
  • 在需要的时间和地点实现功能闭包,使程序更加灵活。

二、lambda表达式的语法

lambda 表达式定义了一个匿名函数,语法如下:

[capture](params) opt -> ret {body;};

capture是捕获列表,params是参数列表,opt是函数选项,ret是返回值类型,body是函数体。

1、捕获列表[]:捕获一定范围内的变量

2、参数列表(): 和普通函数的参数列表一样,如果没有参数参数列表可以省略不写

auto fun = [](){return 0;};
auto fun = []{return 0;};

3、opt选项,不需要可以省略

  • mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
  • exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用throw();

4、返回值类型:在C++11中,lambda表达式的返回值是通过返回值后置语法来定义的。

5、函数体:函数的实现,这部分不能省略,但函数体可以为空。

三、捕获列表

  • [ ] 不捕获任何变量
  • [&] 捕获外部作用域中的所有变量,并且按照引用捕获
  • [=]捕获外部作用域的所有变量,按照值捕获,拷贝过来的副本在函数体内是只读的
  • [= ,&a] 按值捕获外部作用域中的所有变量,并且按照引用捕获外部变量 a
  • [bar] 按值捕获bar变量,不捕获其他变量
  • [this] 捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限

       使用lambda表达式捕获列表捕获外部变量,如果希望去修改按值捕获的外部变量,这就需要使用mutable选项,被mutable修改是lambda表达式就算没有参数也要写明参数列表,并且可以去掉按值捕获的外部变量的只读(const)属性。

int a = 0;
auto f1 = [=] {return a++; };              // error, 按值捕获外部变量, a是只读的
auto f2 = [=]()mutable {return a++; };     // ok

四、返回值

        一般情况下,不指定lambda表达式的返回值,编译器会根据return语句自动推导返回值类型,但是需要注意的是lambda表达式不能通过列表初始化自动推导出返回值类型。

	// 可以自动推导出返回值类型
	auto f = [](int i)
	{
		return i;
	}

	// 不能推导出返回值类型
	auto f1 = []()
	{
		return { 1, 2 };	// 基于列表初始化推导返回值,错误
	}

五、用法

举例:和STL搭配使用

#include <iostream>
using namespace std;
#include<vector>
#include<algorithm>

int main()
{
	vector<int> vec = {1,2,3,4,5,6};
	sort(vec.begin(), vec.end(), [](int a, int b)
	{
		return a > b;
	});
	for (auto it : vec)
	{
		cout << it << " ";
	}
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值