由来
在上一篇博客STL学习之函数对象中提到
Effective STL第46条:考虑使用函数对象而不是函数作为STL算法的参数
在Effective STL成书的时候,c++11应该还没定稿,那时候写函数对象给stl算法调用时很平常的。但是这种写法比较啰嗦,要写全局函数,容易把代码搞得支离破碎,于是c++11提出了Lambda匿名函数,在搭配stl算法的时候非常方便。这里记录下。
平台
vs2015
win10 64bit
代码
无捕获,无输入参数,有返回值
#define NUM 100000
typedef 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);
}
);