C++开发初级


914 浏览 5 years, 10 months

99.4 Lambdas

版权声明: 转载请注明出处 http://www.codingsoho.com/

Lambdas

可调用对象

4类可调用对象

  • 函数:可调用函数并传递参数;
  • 指向成员函数的指针
  • 函数对象:实现了operator()的类的对象
  • Lambda表达式,匿名的函数对象。

在STL的多种算法中,都可以传递以上可调用对象, 根据指定的规则进行比较判断。

简单的Lambdas表达式

[]{
    cout << "Hello lambda" << endl;
}();

相当于匿名的函数对象。

auto mylambda=[]{
    cout << "Hello lambda" << endl;
};
mylambda();

mylambda相当于函数对象,可以调用,也可以作为参数 传递给其他算法。

传参和返回值

auto ff=[](int a, int b) ->int
{    
    return a+b;
};

Lambda表达式也可以传递参数。

通过->指定返回值的数据类型,对于本例中,根据a+b 可推测出返回值类型为int,->可以省略

捕获本地变量

    int x=0;
    int y=42;
//  auto ff=[=x, &y]
    auto ff=[x, &y]
    {
        cout << "x:" << x << endl;
        cout << "y:" << y << endl;
        y++;
    };
    x=y=77;
    ff();
    ff();
    //x:0 y:77 x:0 y:78

=:捕获局部变量,只读访问
&:引用传递,可以进行修改

定义ff后,捕获的x是外部x的拷贝;
定义ff后,捕获的y是外部y的引用;
x=y=77后,ff内的x仍然为0,y改变为77

对应的匿名函数对象

class Temp
{
private:
    const int x;
    int& y;
public:
    Temp(int xx, int& yy): x(xx), y(yy){}
    void operator()(){
        cout << "x:" << x << endl;
        cout << "y:" << y << endl;
        y++;
    };
};

捕获的外部变量定义为Temp的成员 变量,=对应为常量,&对应为引用,

对应的测试程序

int x2=0;
int y2=42;
Temp ff2(x2,y2);
x2=y2=77;
ff2();
ff2();  

外部的x以值传递给ff内部的x,初始化完成后, 2个x脱离关系,且ff内部的x不能修改。

外部的y以引用传递给ff内部的y,对外部或内部的 y修改后,都相互影响,实际是同1个数据。

可修改的=捕获

int x3=0;
int y3=42;
//  auto ff3=[=x, &y]() mutable
auto ff3=[x, &y]() mutable
{
    cout << "x:" << x << endl;
    cout << "y:" << y << endl;
    y++; x++;
};
x3=y3=77;
ff3();
ff3();
cout << "x:" << x << endl; // 这个值没有没ff3修改
cout << "y:" << y << endl;  
// x:0 y:77 x:1 y:78 x:77 y:79 >

外部的x以值传递给ff内部的x,ff内部的x不是常量, 可以修改,但与外部的x只是值传递,没有关系。

参考代码 Lambda.cpp