我在C ++代码中看到以下lambda。它的目的是什么?
static const auto faster = [](){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
答案 0 :(得分:21)
局部static
变量最多由执行其声明的第一个线程初始化一次。通过使用lambda,我们可以利用这一事实最多运行一次任意代码。首次到达声明时,到达该声明的线程将执行lambda中的代码,作为初始化变量的一部分。该变量的值大概没有实际使用,但是程序会记住该变量已被初始化,因此不会再次运行lambda。
答案 1 :(得分:9)
对于在后台使用C ++ I / O的在线法官,您通常会在竞争性编程竞赛提交的内容中看到此代码。为了提高提交的时钟运行时间,可以将流解开并从标准C流中取消C ++ IOStream的同步。使用lambda是一种在声明变量后立即执行代码的巧妙方法。为了获得此优化的全部效果,应将其放置在执行任何其他代码之前。
答案 2 :(得分:1)
这称为立即调用的Lambda(IIL)。
首先声明lambda([] () {...}
),然后立即将其调用(调用)(()
-在lambda之后立即)。
这可以通过多种方式使用:
const auto v = [] () {
if (...) return X;
else return Y;
}
使用复杂的逻辑初始化静态变量
调用IIL为函数的参数创建值
auto x = foo(a, b, [c] () {return c > 42;} () );
main
之前执行操作。