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