• c++11:lambda表达式的使用


    lambda表达式的一般形式:

     [capture list] (parameter list) -> return type{function body}; 

    其中,capture list (捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空);

    return type、parameter list和function body与任何普通函数一样分别表示返回类型、参数列表和函数体。

    但是与普通函数不同,lambda必须使用尾置返回来指定返回类型。

    此外,我可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体:

    auto f = [] { return 42 }

    此例中,我们定义了一个可调用的对象f, 它没有参数,返回值为42;

    调用方式:与普通函数一致;

    cout << f() << endl;

    在忽略了返回值类型的情况下, lambda根据函数体中代码推断出返回值类型;如果函数体只是一个return语句,则返回类型从返回的表达式的类型推断而来。否则,返回类型为void。

    使用条件:

    “引用捕获有时是必要的。例如, 我们可能希望biggies函数接受一个ostream的引用,用来输出数据,并接受一个字符作为分隔符:”

    void biggies(vector<string> &words, 
                      vector<string> ::size_type sz,
                      ostream &os = cout, char c = ' ')
    {
         //打印count的语句改为打印到os
        for_each(words.begin(), words.end(),
                      [&os, c] (const string &s) { os << s << c; });          
    }

    我们不能拷贝ostream对象,因此捕获os的唯一方法就是捕获其引用(或指向os的指针)。

    注意:当引用方式捕获一个变量时,必须保证lambda执行时变量是存在的

    一般来说,我们应该尽量减少捕获的数据量,来避免潜在的捕获导致的问题。而且,如果可能的话,应该避免捕获指针或引用。

  • 相关阅读:
    浅谈左偏树入门
    【洛谷3768】简单的数学题(莫比乌斯反演+杜教筛)
    【51nod1743】雪之国度(最小生成树+倍增)
    【BZOJ1562】[NOI2009] 变换序列(匈牙利算法)
    【HHHOJ】NOIP模拟赛 玖 解题报告
    【BZOJ3930】[CQOI2015] 选数(容斥)
    【BZOJ1257】[CQOI2007] 余数之和(除法分块)
    杜教筛入门
    初学狄利克雷卷积
    关于积性函数的一些知识
  • 原文地址:https://www.cnblogs.com/2018shawn/p/11361053.html
Copyright © 2020-2023  润新知