C++11的Lambda

来源:互联网 发布:信息融合数据关联 编辑:程序博客网 时间:2024/06/05 20:14

由来

在上一篇博客STL学习之函数对象中提到

Effective STL第46条:考虑使用函数对象而不是函数作为STL算法的参数

在Effective STL成书的时候,c++11应该还没定稿,那时候写函数对象给stl算法调用时很平常的。但是这种写法比较啰嗦,要写全局函数,容易把代码搞得支离破碎,于是c++11提出了Lambda匿名函数,在搭配stl算法的时候非常方便。这里记录下。

平台

vs2015
win10 64bit

代码

无捕获,无输入参数,有返回值

#define NUM     100000typedef std::vector<double> VecDouble;VecDouble data(NUM),datacalc(NUM);srand((unsigned)time(NULL));//生成随机数组std::generate(data.begin(), data.end(),     []    {         return rand();     });

如果用函数对象的话需要另外写一个函数

typedef struct _Gen : public std::unary_function<void, double>{    double operator()(void)    {        return(rand());    }}Gen;

然后再调用

std::generate(data.begin(), data.end(), Gen());

相比较而言,Lambda匿名函数更简单方便。

有捕获,有输入参数,无返回值

int cnt = 0;//捕获一个变量计算数组中大于1000的个数std::for_each(data.begin(), data.end(),    [&cnt](double value)    {        if (value > 1000)        {            ++cnt;        }    }    );

有捕获,有输入参数,有返回值

int x = 55;int y = 10;//根据外部参数及数组内部值计算某个数并修改回原数组,其中`->double`可省略std::transform(data.begin(), data.end(), data.begin(),    [&x,&y](double value)/*->double*/    {        return(sqrt(value) + x + y);    }    );

参考

1.遇见C++ Lambda
2.C++lambda详解~读书笔记

0 0
原创粉丝点击