C++11底lambda函数

  lambda来源于函数式编程的概念,也是现代语言编程的表征。

  首先看lambda的骨干用法:

1 [capture] (params) opt->return {body;}

  其中, capture 是捕获列表(即闭包中的擅自变量):

  • [] 不截取任何变量
  • [&]
    截取外部作用域中保有变量,并视作援在部数体中使
  • [=]
    截取外部作用域中享有变量,并拷贝一卖在函数体中应用
  • [=, &foo]
    截取外部作用域中持有变量,并拷贝一客在函数体中行使,但是对foo变量使用引用
  • [bar]
    截取bar变量并且拷贝一客在函数体重使用,同时不截取其他变量
  • [x, &y]
    x按值传递,y按引用传递
  • [this]
    截取当前看似吃的this指针。如果既使用了&或者=就默认添加斯选项。

  params 是参数表;opt是函数选项;return是归值类型;body是函数体。 

  lambda表达式的种类在C++11着为叫做“闭包类型”。我们得认为它是一个含有operator()的近乎。因此,可以利用
std::function 和 std::bind 来存储其品种:

1 std::function<int(int)> f1 = [](int i) {return i; };
2 std::function<int(void)> f2 = std::bind([](int a){ return a; });

  

1 int a = 0;
2 int b = 1;
3 auto f1 = []{return a; };  //error,没有捕获外部变量 
4 auto f2 = [&]{return a++; };
5 auto f3 = [=]{return a; };
6 auto f4 = [=]{return a++; };  //error,a是以复制方式捕获的,无法修改
7 auto f5 = [a]{return a + b; };  //error,没有捕获变量b
8 auto f6 = [a, &b]{return a + (b++); };
9 auto f7 = [=, &b]{return a + (b++); };

 

  举个栗子:

std::vector<int> v = {1, 2, 3, 4};
int sum = 0;
for_each(v.begin(), v.end(), [&sum](int value) {
    sum += value;
});
std::cout << "sum:" << sum << endl;

  lambda表达式还是比较简单的,理解闭包之后便会自在地用好lambda啦。