此lambda的用途是什么?

时间:2019-08-30 21:16:51

标签: c++ c++14

我在C ++代码中看到以下lambda。它的目的是什么?

static const auto faster = [](){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();

3 个答案:

答案 0 :(得分:21)

局部static变量最多由执行其声明的第一个线程初始化一次。通过使用lambda,我们可以利用这一事实最多运行一次任意代码。首次到达声明时,到达该声明的线程将执行lambda中的代码,作为初始化变量的一部分。该变量的值大概没有实际使用,但是程序会记住该变量已被初始化,因此不会再次运行lambda。

答案 1 :(得分:9)

对于在后台使用C ++ I / O的在线法官,您通常会在竞争性编程竞赛提交的内容中看到此代码。为了提高提交的时钟运行时间,可以将流解开并从标准C流中取消C ++ IOStream的同步。使用lambda是一种在声明变量后立即执行代码的巧妙方法。为了获得此优化的全部效果,应将其放置在执行任何其他代码之前。

答案 2 :(得分:1)

这称为立即调用的Lambda(IIL)。

首先声明lambda([] () {...}),然后立即将其调用(调用)(()-在lambda之后立即)。

这可以通过多种方式使用:

  • 通过复杂的逻辑初始化const变量
    const auto v = [] () {
        if (...) return X;
        else return Y;
   }
  • 使用复杂的逻辑初始化静态变量

  • 调用IIL为函数的参数创建值

     auto x = foo(a, b, [c] () {return c > 42;} () );
  • 由于静态变量是通过使用其值将被忽略但使用IIL初始化的静态变量在早期进行初始化的,因此可以用于执行main之前执行操作。