关闭

C++11中的Lambda表达式

发表于:2015-3-02 10:44

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:codingwu    来源:51Testing软件测试网采编

  “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;
}
21/212>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号