正在加载……
专注、离线、切勿分心
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++的类型系统结合使用,如:
auto f=[x](int a,int b){return a>x;});   //x被捕获复制
int x=0,y=1;
auto g=[&y](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声明变量的作用类似,它也允许避免书写过于复杂的参数类型。特别地,不需要显式指出参数类型使使用高阶函数变得更加容易。

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
   vector<int> v;
   for (int i = 0; i < 10; ++i) {
      v.push_back(i);
   }
   int evenCount = 0;
   for_each(v.begin(), v.end(), [&evenCount] (int n) {
      cout << n;

      if (n % 2 == 0) {
         cout << " is even " << endl;
         ++evenCount;
      } else {
         cout << " is odd " << endl;
      }
   });
   cout << "There are " << evenCount
        << " even numbers in the vector." << endl;
}
0 is even
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
There are 5 even numbers in the vector.




posted on 2018-05-07 09:38  正在加载……  阅读(179)  评论(0编辑  收藏  举报