Хотелось бы поговорить об этой новой возможности языка С++, а именно использовании лямбда-функций. Допустим, нам надо обязательно через алгоритм for_each вывести весь контейнер через пробелы на экран. Что мы делаем для этого с использованием лямбда-функций? Пишем вот такой простой код. #include <iostream>
#include <algorithm>
#include <vector>
int main() {
int Arr[] = {1,2,-1,-2,3,-3,4,-4,5,-5};
std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0]));
std::for_each(Vec.begin(), Vec.end(), [](int f){std::cout << f << ' ';});
return 0;
}
Без возможностей такого использования лямбда-функций нам пришлось бы писать отдельный класс, в котором перегружать оператор () или же писать пользовательскую функцию, что несколько увеличивает размер кода. Выглядело бы это так: Пользовательская функция: #include <iostream>
#include <algorithm>
#include <vector>
void Print(int Elem) {
std::cout << Elem << ' ';
}
int main() {
int Arr[] = {1,2,-1,-2,3,-3,4,-4,5,-5};
std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0]));
std::for_each(Vec.begin(), Vec.end(), Print);
return 0;
}
Класс с перегрузкой оператора (): #include <iostream>
#include <algorithm>
#include <vector>
class Print {
public:
void operator()(int Elem) {
std::cout << Elem << ' ';
}
};
int main() {
int Arr[] = {1,2,-1,-2,3,-3,4,-4,5,-5};
std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0]));
std::for_each(Vec.begin(), Vec.end(), Print());
return 0;
}
Это пример реализаций. Разница в размере кода конечно практически не заметна, однако это простой пример. На более сложных примерах будет большая разница. Пример лямбда-функций для умножения, сложения, вычитания элементов вектора: #include <iostream>
#include <algorithm>
#include <vector>
int main()
{
int Arr[] = {1,2,3,4,5,6,7,8,9,10};
std::vector<int> Vec(Arr, Arr+sizeof Arr/sizeof(Arr[0]));
int Sum=0, Mult=1, Sub=0;
std::for_each(Vec.begin(), Vec.end(), [&Sum, &Mult, &Sub](int Elem) {Sum+=Elem; Mult*=Elem; Sub-=Elem;});
std::cout << Sum << ' ' << Mult << ' ' << Sub << '\n';
return 0;
}
Лямбда-функции, да и вообще весь новый стандарт предоставляет очень интересные возможности по удобству использования языка и сокращению количества кода в приложениях. Я привел здесь простые примеры, так как не вижу смысла приводить сложные, в том ключе, что сам я любитель и думаю здесь много таких как я, а не только профессионалов. Все примеры приведены с использованием алгоритма for_each, и с тем предположением, что задача стоит в том, чтобы написать программу, используя именно этот алгоритм. Я попытался просто поделиться тем, что я знаю и показать простые использования лямбда-функций.
|