В чем преимущество "лямбда-выражений"?
причиной лямбда-выражений является неявное создание объектов функций "более удобным способом". Как видно из приведенного ниже примера, он не только менее удобен и длиннее, но и имеет запутанный синтаксис и нотацию.
есть ли какие использует, где это на самом деле делает код более читабельным?
cout << count(vec, [&](int a){ return a < x; }) << endl; // lambda
cout << count(vec, Less_than<int> (x)) << endl; // normal functor def-n
2 ответов
Он более читаем, потому что он помещает реализацию функции прямо в место, где она вызывается, таким образом, сохраняя естественный поток сверху вниз кода без изменений.
вы видите, обычные функции имеют свои плюсы и минусы. С одной стороны, функции помогают уменьшить повторения в коде, что делает код более структурированным и более читаемым. С другой стороны, функции нарушают естественный поток кода и передают управление в совершенно другое место. Это может уменьшить читаемость по довольно очевидным причинам: это похоже на чтение книги, которая пронизана вложенными прямыми и обратными ссылками.
Итак, чтобы правильно воспользоваться свойствами обычных функций, следует использовать их для реализации продуманных, полных и изолированных абстракций. Таким образом, обычные функции улучшат читаемость кода.
но для небольшого" одноразового " одноразового кода утилиты, обычные функции не работай так хорошо. Они действительно могут сделать код значительно менее читаемым. Здесь появляются лямбда-функции. Они позволяют вводить этот одноразовый служебный код прямо в точку вызова, где это необходимо.
лямбда-выражение существует для упрощения кода. Это:
auto fun = []() { return; };
заменяется компилятором на:
// Namespace scope
struct __lambda_1 {
void operator()() { return; }
};
// local scope
__lambda_1 fun{};
это основная мотивация для лямбда-синтаксиса: заменить традиционные объекты функций более удобной для чтения анонимной функцией, объявленной на сайте, где это необходимо, а не иметь отдельный объект функции, который должен быть объявлен в другой области. Это не просто замена именованных объектов функции.
действительно, стандартная библиотека включает в себя ряд именованных объектов, функций как std::unary_function
и такие вещи, как std::less
. Но эти объекты имеют ограниченную полезность и не могут взять на себя каждую потенциальную роль, которую лямбда.
Итак, да, он может сделать код значительно более читаемым, разместив код, который стандартная библиотека не предоставляет точно там, где это требуется, не загрязняя ваш код дюжиной строк struct
s и загрязнение пространства имен именами, которые вы, вероятно, будете использовать не более одного раза или дважды.