标签:c++
在c++11标准中定义了一种新的可调用对象 lambda
lambda类似与匿名函数 , 只不过可以通过一种机制(不是参数)来调用一些局部变量 , 这样就能使自身的参数变少,也就能达到STL中某些算法对谓词的要求。
lambda的形式:

简单的lambda例子:
<span style="font-size:14px;">int a = 2 , b = 3;
auto c = [](int x , int y)->int { return x+y;}; //传递了两个整形的形参
cout<<c(a,b)<<endl;</span><span style="font-size:14px;"> int a = 2 , b = 3;
auto c = [a,b]()->int { return a+b;};//捕获了两个局部变量 a 和 b</span>
1、在lambda中的捕获可以分为值捕获和地址捕获 , 和在函数中的传值、传地址是一样的。
在变量前面加上& , 就表示传地址 , +就表示传值(默认就是传值)
<span style="font-size:14px;"> int a = 2 , b = 3;
auto c = [&a,&]()->int { return a+b;};</span>我们前面的捕获都是显示捕获 , 隐式捕获就是指:把所有的局部变量,都以一种方式进行捕获。
全部以引用(地址捕获)的方式进行捕获:
<span style="font-size:14px;"> int a = 2 , b = 3;
auto c = [&]()->int { return a+b;};</span><span style="font-size:14px;"> int a = 2 , b = 3;
auto c = [&,+a]()->int { return a+b;};</span>当我们需要改变把传入到lambda中值时 , 我们就需要加入mutable , 表示这是一个可变的lambda
<span style="font-size:14px;"> int a = 2 ;
auto c = [a]()mutable->int { return a++;};
cout<<c()<<endl;</span>
如果是引用传递 , lambda能不能改变 , 取决于 , 引用的变量是不是const。
<span style="font-size:14px;">#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct node
{
int value;
}b[10];
int main()
{
int i ;
for(i = 5; i >= 1; i--)
{
b[5-i].value = i;
}
sort(b , b+5 , [](struct node x , struct node y)->bool {return x.value < y.value;});
for(i = 0; i < 5; i++)
cout<<b[i].value<<endl;
return 0;
}
</span>c++11标准中的lambda,布布扣,bubuko.com
标签:c++
原文地址:http://blog.csdn.net/zengchen__acmer/article/details/27220137