起因在于看别人C++题解的时候遇见一段代码(leetcode 451 Sort Characters By Frequency)
sort(s.begin(),s.end(),[&](char a, char b){
return count[a]>count[b]||count[a]==count[b]&&a<b;
});
该代码实现的是将字符串s按照出现次数存储到count数组里,然后再按出现次数进行排序;如果出现的次数相等,就按字符串从小到大排序。(sort()参见:sort介绍)
sort(s.begin(),s.end(),[&](char a, char b){
return count[a]>count[b]||count[a]==count[b]&&a<b;
});
注意到[&]这个从未遇见过的东西,查阅资料以后发现该sort()的cmp方法用的是匿名函数,下面正式开始介绍……
lambda函数,也叫lambda表达式,常简称lambda,是C++11添加的新功能,旨在帮助编程新手——《C++ primer plus》
lambda函数利用[]取代了函数名称,并且没有声明函数返回类型,返回类型是用decltyp推断得到的。如果函数没有返回语句,那返回类型就是void。(decltyp参见:decltyp介绍)
lambda函数最大的优点就在于能在函数体的内部定义(相较于常规的函数,函数内部是不能再定义函数的),并且lambda可以定义在使用的旁边(如示例代码的sort所需的cmp函数),便于阅读和修改。
最后,lambda定义的[]还有一些其他的用法用以限定访问。
[z]
按值访问z变量
[&]
按引用访问所有动态变量
[=]
按值访问所有动态变量
[&z]
按引用访问z变量
[ted,&ed]
按值访问ted并按引用访问ed
[&,ted]
按值访问ted并按引用访问其他所有动态变量
[=,&ed]
按引用访问ed并按值访问其他所有动态变量
PS:以上访问都是在函数作用域内有效,函数作用域参加文章:函数作用域概述。
至此,文章开头的疑惑也得到了解答,[&]不是一个能通用的像’&’一样的运算符,而是在lambda中使用的限定符。
这是我的第一篇技术文档。如果有地方写的不对,欢迎在评论里指出,或者联系我。此外,文章内有些地方所谓“参见”,是我自己写的一些技术文档;如果还没有链接,那就是我还没写,以后会补上。
- 本文作者: crlwebby
- 本文链接: https://crlwebby.github.io/language/C-plus-plus/C++_lambda/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!