• lambda表达式


    首先看一下lambda表达式的格式

    [外部变量访问方式说明符] (参数表) -> 返回值类型
    {
       语句块
    }

    其实lambda表达式就是一个简单的函数

    格式里面的参数,返回值,语句块 都是普通函数的参数 返回值和函数体

    前面的访问方式说明符有两种 [&] [=]

    [=]  表示变量不可被修改

    [&]  和[=]相反,表示变量可以被修改

    举个栗子

    int main(int argc,char *argv[])
    {
        auto fun = [=](int a)->int { return a; };
        cout << fun(6) << endl;
        return 0;
    }

    输出自然是6,这个表达式就相当于这样一个函数 输出一个int 然后return这个int

    如果我将这个例子稍加改动,在return 之前先改一下a,那就要用[&]

    int main(int argc,char *argv[])
    {
        auto fun = [&](int &a)->int { a++; return a; };
        int a = 6;
        cout << fun(a) << endl;
        return 0;
    }

    当然了也可以不写返回值,这样编译器会自动识别你的返回值,如果没有返回值就返回void

    int main(int argc,char *argv[])
    {
        auto fun = [&](int &a){ a++; return a; };
        int a = 6;
        cout << fun(a) << endl;
        return 0;
    }

    [=, &x, &y]  表示外部变量 x、y 的值可以被修改,其余外部变量不能被修改;
    [&, x, y]      表示除 x、y 以外的外部变量,值都可以被修改。

    甚至我还可以没有参数列表

    int main(int argc,char *argv[])
    {
        auto fun = [&](){ cout << "a" <<endl; };
        fun();
        return 0;
    }

    看下面这个例子

    int b = 8;
    
    int main(int argc,char *argv[])
    {
        static int a = 6;
        auto fun = [&](){ a++; return a+b; };
        cout <<fun()<<endl;
        return 0;
    }

    输出值为15

    我没有传入参数,但是他能使用我前面定义过的全局变量和静态变量。

    int b = 8;
    
    int main(int argc,char *argv[])
    {
        static int a = 6;
        int c = 8;
        auto fun = [=](){ a++; return c = a+b+c; };
        cout <<fun()<<endl;
        return 0;
    }

    这个代码就是错误的,因为在函数体里面改变了c的值,但是访问说明符是[=]

    所以要改成

    int b = 8;
    
    int main(int argc,char *argv[])
    {
        static int a = 6;
        int c = 8;
        auto fun = [&](){ a++; return c = a+b+c; };
        cout <<fun()<<endl;
        return 0;
    }

    这样才能得出正确结果23

  • 相关阅读:
    一周内签到连续天数求解
    int型动态数组总结
    快速排序总结
    希尔排序总结
    冒泡排序的总结
    桶排序总结
    插入排序的总结
    选择排序的总结
    二分法的五种实现
    安装Yum源
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12697068.html
Copyright © 2020-2023  润新知