C++11中的lambda表达式

3 篇文章 0 订阅

1.什么是lambda

C++ 98/03标准并不原生支持匿名函数,如果你想实现类似的功能的话,可以利用Boost.Lambda来实现一个匿名函数。但是从C++11以来,C++提供了我们一个强有力的工具,允许我们编写一个匿名的函数,它可以方便你写一些短小的代码,这些代码不会被重用,也不值得命名。 表达式最简单的定义如下:

[ capture clause ] (parameters) -> return-type  
{   
   definition of method   
} 

2.怎么使用lambda

在C++11之前,我们想要用到STL的一些算法来操作我们的容器,比如我们想在一个vector里找到大于10小于20的数,把他们打印出来,那我们需要这样做:

1.先定义一个仿函数,类似下面这样:

struct Func
{
    void operator()(int n)
    {
        if (n > 10 && n < 20)
        {
            std::cout << n << "\n";
        }
    }
};

2.然后把它传递给算法:

 vector<int> v{0,15,23,12,14,10,20,33};

 std::for_each(v.begin(), v.end(), Func());

/*
    会打印出:
    15
    12
    14
*/

这样的做法很麻烦,因为我们每次使用一个需要仿函数作为一个实参的算法的时候,都需要另外写一个仿函数。

现在,有了lambda,你可以简单的写成这样:

std::for_each(v.begin(), v.end(), [](int n)
{
    if (n > 10 && n < 20)
    {
        std::cout << n << std::endl;
    }
});

3.发生了什么

lambda表达式其实就是一个类。为了调用它,编译器需要实例化类的一个对象。从lambda表达式实例化的对象,我们称之为lambda闭包。

当你写下一个lambda表达式时,比如:

auto i_am_lambda = [](int x, int y)->bool { return x > y; };

编译器会在内部为生成下面的类:

class __lambda_1
{
public: 
    bool operator()(int x, int y) const
    {
        return x > y;
    }
};

明白这一点至关重要。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值