zoukankan      html  css  js  c++  java
  • C++11 STL Lambda表达式

    语法如下:

    //直接调用
    []{
        cout<<"hello lambda1"<<endl;
    }();
    
    //传递给对象
    auto l=[]{
        cout<<"hello lambda2"<<endl;
    };
    l();

    Lambda可以有参数

    auto l2 = [](const string& s){
        cout<<"s: "<<s<<endl;
    };
    l2("hello lambda3");

    Lambda 可以返回某物。但不需要指明返回类型。该类型会根据返回值被推导出来。

    如果想指明一个返回类型,可使用新式C++语法。

    int a = [] {
        return 42;
    }();
    cout<<"a="<<a<<endl;
    
    double b = [] () -> double {
        return 43;
    }();
    cout<<"b="<<b<<endl;

    方括号内,可以指明一个capture用来处理外部作用域内,未被传递为实参的数据

    [=]表示外部作用域的以by value的方式传递给lambda。Lambda内修改变量不会改动外部作用域的数据。

    [&]表示外部作用域的以by reference的方式传递给lambda。Lambda内修改变量会改动外部作用域的数据。

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

    以上的代码也可以用 [=, &y]取代 [x,&y]

     mutable的作用:

        int id=0;
        auto f1=[id]()mutable{
            cout<<"id :"<<id<<endl;
            ++id;
        };
        id=42;
        f1();
        f1();
        f1();

     上述行为可视为:

        class{
        private:
            int id;
        public:
            void operator ()(){
                cout<<"id :"<<id<<endl;
                ++id;
            }
    
        };

    Lambda类型。

    Lambda类型是个匿名function object。如果想根据该类型声明对象。可借助template或auto。如果实在需要写下该类型,可使用decltype()。或者使用std::function<> class template。

    #include <iostream>
    #include <functional>
    
    std::function<int(int,int)> returnLambda(){
        return [](int x,int y){
            return x*y;
        };
    }
    
    int main(){
        auto lf=returnLambda();
        cout<<"lf(5,7)="<<lf(5,7)<<endl;
        return 0;
    }
  • 相关阅读:
    设计模式20-观察者模式
    设计模式19-备忘录模式
    设计模式18-中介者模式
    设计模式17-迭代器模式
    设计模式16-解释器模式
    Wireshark基本介绍和学习TCP三次握手
    Jmeter CSV 参数化/检查点/断言
    Jmeter运营活动并发测试—巧用集合点
    一个简单的性能测试
    Jmeter对HTTP请求压力测试、并发测试
  • 原文地址:https://www.cnblogs.com/xiaoaofengyue/p/12853819.html
Copyright © 2011-2022 走看看