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类型
,只要支持+运算的类型都可以使用这个匿名函数,不需要重新定义一份。
好了,关于这个问题就分享到这了,有用的话点个赞呗,谢谢。