Я вижу следующую лямбду в коде C++. Какова цель этого?
static const auto faster = [](){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
Я вижу следующую лямбду в коде C++. Какова цель этого?
static const auto faster = [](){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
Локальная переменная static
инициализируется не более одного раза первым потоком, который выполняет ее объявление. Используя лямбду, мы можем воспользоваться этим фактом для запуска произвольного кода не более одного раза. При первом достижении объявления поток, который его достигает, выполнит код в лямбда-выражении как часть инициализации переменной. Значение переменной предположительно фактически не используется, но программа запомнит, что переменная была инициализирована, поэтому лямбда не будет запущена во второй раз.
Вы обычно видите этот код в конкурсных конкурсах по программированию для онлайн-судей, которые используют C++ ввод/вывод за кулисами. Чтобы увеличить время выполнения ваших представлений, вы можете развязать потоки и отменить синхронизацию C++ IOStreams из стандартных потоков C. Использование лямбды - удобный способ выполнить код сразу после объявления переменной. Чтобы получить полный эффект от этой оптимизации, она должна быть размещена перед выполнением любого другого кода.
Это называется немедленной лямбда (IIL).
Сначала объявляется лямбда ([] () {...}
), затем сразу же она вызывается (вызывается) (()
- сразу после лямбды).
Это можно использовать несколькими способами:
const auto v = [] () {
if (...) return X;
else return Y;
}
инициализировать статическую переменную со сложной логикой
вызвать IIL, чтобы создать значение для параметра функции
auto x = foo(a, b, [c] () {return c > 42;} () );
main
.