C++11的Lambda

2 篇文章 0 订阅

由来

在上一篇博客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);
    }
    );

参考

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值