• 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;
    }
  • 相关阅读:
    Linux菜鸟起飞之路【三】Linux常用命令
    Linux菜鸟起飞之路【二】Linux基本常识
    Linux菜鸟起飞之路【一】基本知识与Linux的安装
    交换机和路由器区别
    netdom join more ou
    keepalive.conf配置模板
    mysql7.7.22 Gtid主从搭建
    python 列表处理
    python openpyxl模块使用
    mysql5.7
  • 原文地址:https://www.cnblogs.com/xiaoaofengyue/p/12853819.html
Copyright © 2020-2023  润新知