(摘录)ISO C++ Lambda表达式
来源:互联网 发布:移动数据不可用 编辑:程序博客网 时间:2024/06/06 02:46
ISO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下:
[捕获列表](形参列表) mutable ->返回值类型 复合语句
其中除了“[]”(其中捕获列表可以为空)和“复合语句”(相当于具名函数定义的函数体),其它都是可选的。它的类型是唯一的具有成员operator()的非联合的类类型,称为闭包类型(closure type)。
例如调用<algorithm>中的std::sort,ISO C++ 98 的写法是要先写一个compare函数:
bool compare( int & a, int & b)
{ return a > b; // 降序排序 } |
然后,再这样调用:
sort(a, a+n, compare); |
然而,用ISO C++ 11 标准新增的Lambda表达式,可以这么写:
sort(a, a + n, []( int a, int b){ return a > b;}); // 降序排序 |
这样一来,代码明显简洁多了。
由于Lambda的类型是唯一的,不能通过类型名来显式声明对应的对象,但可以利用auto关键字和类型推导:
auto f = []( int a, int b){ return a > b;}); |
和其它语言的一个较明显的区别是Lambda和C++的类型系统结合使用,如:
auto f = [=]( int a, int b){ return a > x;}); //x被捕获复制 int x = 0, y = 1; auto g = [&]( int x){ return ++y;}); //y被捕获引用,调用g后会修改y,需要注意y的生存期 bool (*fp)( int , int ) = []( int a, int b){ return a > b;}); //不捕获时才可转换为函数指针 |
Lambda表达式可以嵌套使用。
即将出版的ISO C++14支持基于类型推断的泛型lambda表达式。上面的排序代码可以这样写:
sort(a, a + n, []( const auto & a, const auto & b){ return a > b;}); // 降序排序:不依赖a和b的具体类型 |
因为参数类型和函数模板参数一样可以被推导而无需和具体参数类型耦合,有利于重构代码;和使用auto声明变量的作用类似,它也允许避免书写过于复杂的参数类型。特别地,不需要显式指出参数类型使使用高阶函数变得更加容易。
阅读全文
0 0
- (摘录)ISO C++ Lambda表达式
- Lambda表达式摘录
- 【c/c++】Lambda表达式
- C#--Lambda表达式
- C#:Lambda 表达式
- C++lambda表达式
- C++lambda表达式
- C# Lambda表达式
- C++:lambda表达式
- C#Lambda表达式
- 【c++】lambda表达式
- C++lambda表达式简记
- c#lambda表达式复习
- [C++]Lambda表达式简介
- 【C#】理解Lambda表达式
- 【C++】Lambda表达式
- C++lambda表达式
- C++Lambda表达式用法
- 简单的tensorflow:2_两层网络and more
- 深度解读
- 为何D3D11的几个矩阵需要转置?
- 云栖·虾米音乐节嘉宾阵容、歌单曝光!今年马云会唱什么歌?
- 基于opencv和Tensorflow的实时手势识别(3)
- (摘录)ISO C++ Lambda表达式
- ADC实验
- 使用Zeplin 过程中 TextView不显示的问题?
- Generating Complex Procedural Terrains Using GPU
- Mac常用命令
- Android 工程内嵌资源文件的两种方法
- (转)规划从 OpenGL ES 2.0 到 Direct3D 的移植
- APP安全防护常见问题分析
- GL_INTERFACE使用及介绍