C ++ lambda表达式

时间:2011-03-25 12:55:56

标签: c++ boost lambda

我想了解lambda表达式。

它超越了我的头脑。需要自我解释的例子

请!

5 个答案:

答案 0 :(得分:4)

lambda表达式是一种指定函数对象的机制。 lambda的主要用途是指定由某个函数执行的简单操作。例如:

vector<int> v = {50, -10, 20, -30};

std::sort(v.begin(), v.end());  // the default sort
// now v should be { -30, -10, 20, 50 }

// sort by absolute value:
std::sort(v.begin(), v.end(), [](int a, int b) { return abs(a)<abs(b); });
// now v should be { -10, 20, -30, 50 }

参数[&](int a, int b) { return abs(a)<abs(b); }是“lambda”(或“lambda函数”或“lambda表达式”),它指定给定两个整数参数的操作a和b返回比较其绝对值的结果。

[&amp;]是一个“捕获列表”,指定使用的本地名称将通过引用传递。我们本来可以说我们只想“捕获”v,我们可以这么说:[&amp; v]。如果我们想通过值传递v,我们可以这么说:[= v]。什么都不捕获[],通过引用捕获全部是[&amp;],并且按值捕获全部是[=]。

http://www2.research.att.com/~bs/C++0xFAQ.html#lambda

答案 1 :(得分:4)

如果您熟悉当前的C ++仿函数(即实现operator()的类,以便它们可以像函数一样被调用,但是具有可以初始化的内部数据成员),那么基本上lambdas就是通过使您能够创建仿函数以及在将要调用它们的位置对其进行初始化而不必定义仿函数类,可以很好地扩展该语言特性。 Lambdas也非常灵活,因为它们可以是闭包,允许您“捕获”当前范围内任何变量的值。

我觉得这是Visual C ++团队博客上的一个非常好的资源,它经历了很多这些功能: Lambdas, auto, and static_assert: C++0x Features in VC10, Part 1

希望这有帮助,

杰森

答案 2 :(得分:3)

lambda表达式(也称为lambda函数)是在调用地定义的无名函数。

例如,访问Examples on Lambda Expression

更好的学习场所:

答案 3 :(得分:2)

如果您愿意,还有另一个例子:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    // Initialization C++0x-style
    vector<int> voo = { 1, 2, 3, 4, 5 };

    // Lambda is here
    auto print = [&](int& i) { cout << i << endl; } ;

    // Check that out, no loop !
    for_each(voo.begin(), voo.end(), print);

    return 0;
}

答案 4 :(得分:0)

Lambda很简单。记住通用语法1st

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

通常,Lambda函数的返回类型由编译器本身求值,我们不需要明确地指定该值,即-> return-type。

Rest是C ++。

例如

  1. 捕获对象

    • [](){}没有捕获
    • [=](){}通过复制捕获所有内容(不推荐)
    • [&](){}通过引用捕获所有内容(不推荐)
    • [x](){}通过副本捕获x
    • [&x](){}通过引用捕获x
    • [&,x](){}通过副本捕获x,通过引用捕获其他所有内容 [=,&x](){}通过引用捕获x,通过复制捕获其他所有内容
  2. 捕获该指针

class Example
{
public:
    Example() : m_var(10) {}
    void func()
    {
        [=]() { std::cout << m_var << std::endl; }();
    }
private:
    int m_var;
};
int main()
{
    Example e;
    e.func();
}

this指针也可以使用[this],[=]或[&]捕获。在任何一种情况下,都可以像在常规方法中一样访问类数据成员(包括私有数据)。

  1. 以Lambda作为参数
template <typename Functor>
void f(Functor functor)
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}
/* Or alternatively you can use this
void f(std::function<int(int)> functor)
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
} 
*/
int g() { static int i = 0; return i++; }
int main()
{
    auto lambda_func = [i = 0]() mutable { return i++; };
    f(lambda_func); // Pass lambda
    f(g);           // Pass function
}

输出:

Function Type : void f(Functor) [with Functor = main()::<lambda(int)>]
Function Type : void f(Functor) [with Functor = int (*)(int)]

来源:Learn Lambda function in C++ with example