C++11中Lambda新特性
1.定义
lambda匿名函数的语法格式:
[外部变量访问方式说明符](参数)mutablenoexcept/throw()->返回值类型
{
函数体;
};
其中各部分的含义分别为:
a.[外部变量方位方式说明符]
[]方括号用于向编译器表明当前是一个lambda表达式,其不能被省略。在方括号内部,可以注明当前lambda函数的函数体中可以使用哪些“外部变量”。所谓外部变量,指的是和当前lambda表达式位于同一作用域内的所有局部变量。
b.(参数)
和普通函数的定义一样,lambda匿名函数也可以接收外部传递的多个参数。和普通函数不同的是,如果不需要传递参数,可以连同()小括号一起省略;
c.mutable
此关键字可以省略,如果使用则之前的()小括号将不能省略(参数个数可以为0)。默认情况下,对于以值传递方式引入的外部变量,不允许在lambda表达式内部修改它们的值(可以理解为这部分变量都是const常量)。而如果想修改它们,就必须使用mutable关键字。注意:对于以值传递方式引入的外部变量,lambda表达式修改的是拷贝的那一份,并不会修改真正的外部变量;
d.noexcept/throw()
可以省略,如果使用,在之前的()小括号将不能省略(参数个数可以为0)。默认情况下,lambda函数的函数体中可以抛出任何类型的异常。而标注noexcept关键字,则表示函数体内不会抛出任何异常;使用throw()可以指定lambda函数内部可以抛出的异常类型。
e.->返回值类型
指明lambda匿名函数的返回值类型。
如果lambda函数体内只有一个return语句,或者该函数返回void,则编译器可以自行推断出返回值类型,此情况下可以直接省略"->返回值类型"。
f.函数体和普通函数一样,lambda匿名函数包含的内部代码都放置在函数体中。该函数体内除了可以使用指定传递进来的参数之外,还可以使用指定的外部变量以及全局范围内的所有全局变量。
2.eg:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int num[4]= {4,2,3,1};
//对a数组中的元素进行排序
sort(num,num+4,[=](int x,int y)->bool
{
return x<y;
});
for(int n:num) {
cout<<n<<"";//1234
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y) {
return x<y;
}
int main()
{
int num[4]= {4,2,3,1};
//对a数组中的元素进行排序
sort(num,num+4,cmp);
for(auto n:num) {
cout<<n<<"";//1234
}
return 0;
}
相关文章
- 真正老司机必备的手机浏览器看下:Chrome可以卸了!
- 为什么你的手机需要更强大的AI 处理器?
- 苹果iPhone 11用户在iOS 13.3.1 Beta 2中可以禁用超宽带功能了
- 微软 GitHub 发布 Android Beta 版,支持暗黑模式
- 苹果2020不行了?库克:看你们谁有我赚得多
- 2019年苹果表现如何?读完这10个故事就明白了
- 外媒The Verge:苹果走过辉煌十年,但库克做产品难超乔布斯
- 谷歌官方突然决定,苹果猝不及防,安卓系统将迎来“大换血”
- 苹果终于要给MacBook Pro加上面容识别了?
- iOS 13.2.2系统,到底值不值得更新?清楚这几点你就明白了
- 两个月八次版本更新,iOS 13 遇到了什么问题?
- 因 Bug 太多,苹果打算大改 iOS 14 的开发模式
- 7 款 Mac 工具,提高你的效率!
- 支付宝一大波新功能上线:彻底离不开了
- 为什么9102年了,我们还要清理iOS缓存?
- 关于手机“系统更新”,究竟有没有升级的必要?来看看优缺点
- 高通副总裁Reiner Klement:“5G+人工智能+云”将如何变革未来产业
- 微信还能这样玩?教你用微信远程控制电脑
- 这样的 iOS 14 概念设计,你喜欢吗
- 万字长文!超全面的B端产品设计指南