• (摘录)ISO C++ Lambda表达式


    ISO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下:
    [捕获列表](形参列表) mutable ->返回值类型 复合语句
    其中除了“[]”(其中捕获列表可以为空)和“复合语句”(相当于具名函数定义的函数体),其它都是可选的。它的类型是唯一的具有成员operator()的非联合的类类型,称为闭包类型(closure type)。
    例如调用<algorithm>中的std::sort,ISO C++ 98 的写法是要先写一个compare函数:
     
     
     
     
     
    bool compare(int & a, int & b)
    {
        return a > b;   // 降序排序
    }
    然后,再这样调用:
     
     
    sort(a, a+n, compare);
    然而,用ISO C++ 11 标准新增的Lambda表达式,可以这么写:
    sort(a, a + n, [](int a, int b){return a > b;}); // 降序排序
    这样一来,代码明显简洁多了。
    由于Lambda的类型是唯一的,不能通过类型名来显式声明对应的对象,但可以利用auto关键字和类型推导:
     
    auto f = [](int a, int b){return a > b;});
    和其它语言的一个较明显的区别是Lambda和C++的类型系统结合使用,如:
    auto f = [=](int a, int b){return a > x;}); //x被捕获复制
    int x = 0, y = 1;
    auto g = [&](int x){return ++y;}); //y被捕获引用,调用g后会修改y,需要注意y的生存期
    bool(*fp)(int, int) = [](int a, int b){return a > b;}); //不捕获时才可转换为函数指针
    Lambda表达式可以嵌套使用。
    即将出版的ISO C++14支持基于类型推断的泛型lambda表达式。上面的排序代码可以这样写:
    sort(a, a + n, [](const auto& a, const auto& b){return a > b;}); // 降序排序:不依赖a和b的具体类型
    因为参数类型和函数模板参数一样可以被推导而无需和具体参数类型耦合,有利于重构代码;和使用auto声明变量的作用类似,它也允许避免书写过于复杂的参数类型。特别地,不需要显式指出参数类型使使用高阶函数变得更加容易。
  • 相关阅读:
    Asp.net与SQL一起打包部署安装(收集)
    算法:计算1的个数
    安装oracle817后出现的问题
    DataTime.ToString 的方法。
    历史上最经典智力题
    困惑,个人资源管理混乱不堪。
    Test for this blog
    转:一个硕士应届生的面试总结.(很精彩,特别是具体的各公司面试信息)
    太强了,不转不行,学习JAVA必备!(转载)
    可定制个性化页面JS(转)
  • 原文地址:https://www.cnblogs.com/voidobject/p/3975575.html
Copyright © 2020-2023  润新知