C++11-----Lambda函数

1、Lambda函数简介

Lambda函数:也叫做lambda表达式,有的地方叫做闭包,简单来说就是一个匿名函数。

好处: 这是c++11新特性的一个非常好用的特性,它可以让我们很方便的随手定义一个函数,并把函数当做参数给别的函数调用,这样代码看起来很简洁,读起来也直观,不用在复杂的代码的中跳来跳去的。

2、实例

比如有一个数组:

vector<int> ar = {3, 7, 1, 6, 5, 9, 0, 4};

我们要将它排序,如果我们不用lambda表达式,用普通的方式创建一个函数来进行排序,而我们用一个排序函数 sort() 就可以轻松的排列出来。

那么如何创建一个匿名函数(Lambda函数)

[](int a, int b){return a < b;}

上述就是一个简单的Lambda函数, 那么它和其他函数有什么区别呢?
有两个差别:使用 [] 替代了函数名(这就是匿名的由来);
没有声明返回类型,返回类型相当于使用decltype 根据返回值推断出来的。如果lambda 不包含返回语句,那么推断出来的返回类型就是 void。

vector<int> ar = {3, 7, 1, 6, 5, 9, 0, 4};
sort(ar.begin(),ar.end(), [](int a, int b){return a < b;});

这样我们就将这个数组升序排列了,匿名函数可以当做函数参数,这样看来就非常方便了。
如果多有几个数组再这样使用的话那就有点麻烦了,不过我们还有解决方法,那就是支持给 lambda指定一个名称

vector<int> ar1 = {3, 7, 1, 6, 5, 9, 0, 4};
vector<int> ar2 = {4, 6, 2, 5, 3, 7, 0, 8};
auto mod =  [](int a, int b){return a < b;}
sort(ar1.begin(),ar1.end(), mod);
sort(ar2.begin(),ar2.end(), mod);

使用auto推断表达式返回的类型,sort()的第三个参数是函数对象(mod),
这就非常nice。

3、变量捕获

lambda 还有一些额外功能,具体说就是:lambda 可以访问作用域内的任何动态变量;要捕获要使用的变量,只需要将变量名放到中括号即可。

如果只指定变量名,如[a], 将按值访问。
如果名称前面加上&,如[&a], 那么就是按引用访问。
如果是[=], 那么表示全是按值访问。
如果是[=], 那么表示全是按引用访问。
如果是[a, &a], 则即是按值访问和按引用访问,依次类推。

int a = 0;
[a](int a, int b){ a = 10; return a < b;}//按值访问
[&a](int a, int b){ a = 10; return a < b;}//按引用访问

4、新特性

另一个C++14新增功能是:

[](auto a, auto b){ return a + b;}

参数支持auto类型,这让匿名函数变得更加泛型,
例:

[](int a, int b){return a + b;}

原来我们需要显示的指定匿名函数,比如a 和 b ,我们都要写int 或者 double 等类型,现在我们写成auto类型 ,只要支持+运算的类型都可以使用这个匿名函数,不需要重新定义一份。

好了,关于这个问题就分享到这了,有用的话点个赞呗,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学编程*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值