Узнайте, как лямбда-выражения могут сделать ваш код более эффективным и простым в обслуживании.
Языки программирования постоянно развиваются, даже такие, как C++, давно зарекомендовавшие себя. Они добавляют функции в стандартные библиотеки и вносят другие изменения, чтобы облегчить работу программистов, работающих в динамической области.
В рамках обновлений, вызванных эволюцией языка, C++ добавил поддержку лямбда-выражений в выпуске 2011 года.
Что такое лямбда-выражение и как вы можете использовать его в своих интересах как программист C++?
Что такое лямбда-выражение?
Лямбда-выражение также известно как лямбда-функция. Это встроенное выражение с возможностью принимать аргументы, выполнять операции и возвращать значение, как типичная функция.
Вы можете использовать лямбду внутри другой функции и присвоить ее переменной. Функции Lamba — это практичный способ определения объекта анонимной функции в программе. Почти каждый язык поддерживает лямбда-выражения, хотя каждая реализация отличается от других.
Из каких частей состоит лямбда-выражение C++?
Лямбда-выражения легко использовать в C++. Вы можете разбить синтаксис лямбда-выражения на C++ следующим образом:
[capture_clause](параметры) options { expression_body; }
Например:
инт значение = 13;
авто суммаПлюсВал = [значение](инт а, инт б) изменчивыйнет кроме ->инт { возвращаться вал + а + б; };
суммаПлюсВал(2, 5); // 20
Этот код объявляет суммаПлюсВал переменная auto, потому что лямбда-выражение может принимать и возвращать данные любого типа. Это оставляет за компилятором право определять тип во время компиляции.
Из приведенного выше кода видно, что лямбда-выражение содержит несколько частей, которые определяют, как оно работает. Вот краткий обзор каждого из этих компонентов.
-
Оговорка о захвате: это первая часть лямбда-выражения, в которой вы можете указать уже существующие переменные или определить новые для использования в теле выражения. Существуют различные способы указания захватов, например:
авто addTwo = [foo](){ возвращаться фу + 2; }; // по значению
auto addThree = [&bar](){ возвращаться бар + 3; }; // по ссылке
авто addAllVal = [=](){ возвращаться фу + бар; }; // все по значению
авто addAllRef = [&](){ возвращаться фу + бар; }; // все по ссылке// создаем переменную в предложении захвата
auto createVarInCapture = [fooBar = foo + bar](){ возвращаться fooBar * 5; };// нет захвата - возвращает ошибку, потому что foo недоступен
автоматическое выражение ошибки = [](){ возвращаться фу + 2; }; - Параметры: Эта часть лямбда-выражения также необязательна. Он содержит параметры функции, требуемые лямбдой. Это ничем не отличается от обычного способа определения параметров функций в C++.
-
Опции: Вы также можете указать параметры при определении лямбда-выражения. Вот некоторые варианты, которые вы могли бы использовать: изменчивый, исключение (например нет кроме в первом примере кода), -> тип_возврата (например ->целое), требует, атрибуты, так далее. изменчивый Опция часто используется, потому что она позволяет изменять захваты внутри лямбды. Код ниже демонстрирует это.
Хотя другие параметры используются редко, вы можете получить больше информации о них на cppreference.com страница по лямбдам.инт значение = 10;
// возвращает ошибку - значение является константой внутри выражения
автоматическое уменьшение = [значение](){ возвращаться --ценность; };
автоинкремент = [значение]() изменяемый { возвращаться ++значение; };
приращение(); // 11 - Тело выражения: это тело лямбда-выражения, которое выполняется и возвращает значение, как и функция. При необходимости вы можете разделить тело лямбда-выражения на несколько строк. Тем не менее, рекомендуется делать его как можно более кратким, чтобы предотвратить неорганизованный код.
Каковы преимущества лямбда-выражений?
Есть много преимуществ использования лямбда-функций в вашем коде. Помимо повышения скорости и эффективности разработки, основные преимущества, которые вы получаете от лямбда-выражений, заключаются в следующем:
- Лямбда-выражения помогают содержать код в чистоте. Один из лучших способов сделать ваш код простым и аккуратным — использовать лямбда-выражения там, где это возможно. Это может быть очень полезно для поддержания удобочитаемой и многократно используемой структуры кода.
-
Вы можете передавать лямбда-выражения другим функциям в качестве параметров.. Стандартная библиотека C++станд:: сортировать() метод использует это преимущество. Вы можете передать лямбду в качестве одного из параметров этого метода, чтобы указать, как функция должна выполнять сортировку. Например:
станд:: вектор<инт> обр = {2, 5, 1, 3, 4};
std:: sort (arr.begin(), arr.end(), [](инт а, инт б){ возвращаться а < б; });
// обр = {1, 2, 3, 4, 5} -
Лямбды многоразовые. Иногда вам может понадобиться повторно использовать блок кода в рамках функции вашей программы без необходимости определять новую функцию. Лямбды могут быть очень полезны в таких случаях. Рассмотрим следующий пример повторно используемого лямбда-выражения:
Эта программа дает следующий результат: Этот пример демонстрирует, насколько просто определить лямбду, чтобы вы могли использовать ее с любым типом.#включают <iostream>
с использованием пространство именстанд.;интглавный(){
// определяем многократно используемую лямбду
auto addUp = [](auto a, auto b, auto c) noexcept {
cout <<"Теперь добавляем... "<< а <<", "<< б <<" а также "<< с << конец;
возвращаться а + б + с;
};cout << добавить (22, 33, 44) << конец;
cout << добавить(строка("Счастливый "), нить("Рождение"), нить("день")) << конец;
cout << добавить(истинный, ЛОЖЬ, истинный) << стд:: эндл; // выполняется как числа (1 и 0)
}
Использование лямбда-выражений в C++
Есть много других преимуществ, которые предлагают лямбда-выражения, и вы обнаружите их по мере усложнения структуры вашей программы. На самом деле, программисты на C++ иногда называют лямбда-выражения замыканиями, потому что это отличный способ реализовать замыкания в коде.
Вы должны рассмотреть лямбда-выражения, если хотите включить современные концепции C++ в свою кодовую базу.