C++11中的Lambda表达式
作者:网络转载 发布时间:[ 2015/3/2 16:12:15 ] 推荐标签:C++ 软件开发 内联函数
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
ISO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下:
[capture list] (parameter list) ->return type { function body }
其中除了“[ ]”(其中捕获列表可以为空)和“复合语句”(相当于具名函数定义的函数体),其它都是可选的。它的类型是的具有成员operator()的非联合的类类型,称为闭包类型(closure type)。
C++中,一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。
它与普通函数不同的是,lambda必须使用尾置返回来指定返回类型。
例如:调用<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++的类型系统结合使用,如:
autof = [x](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声明变量的作用类似,它也允许避免书写过于复杂的参数类型。特别地,不需要显式指出参数类型使使用高阶函数变得更加容易。
下面举一个简单使用Lambda表达式的例子:
#include<iostream>
#include<algorithm>
#include<vector>
#include<ostream>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++){
v.push_back(i);
}
for_each(v.begin(), v.end(), [](int n){cout << n << " "; });
cout << endl;
return 0;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11