这个 lambda 的目的是什么?

What's the purpose of this lambda?

本文关键字:是什么 这个 lambda      更新时间:2023-10-16

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

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

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

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

这称为即时调用的 Lambda (IIL(。

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

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

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

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

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