Сазнајте како ламбда може учинити ваш код ефикаснијим и лакшим за одржавање.
Програмски језици се непрестано развијају, чак и они попут Ц++ који су се одавно успоставили. Они додају функције стандардним библиотекама и праве друге измене како би олакшали посао програмерима који раде у динамичком пољу.
Као део ажурирања које је донела еволуција језика, Ц++ је додао подршку за ламбда изразе у свом издању из 2011. године.
Шта је тачно ламбда израз и како га можете користити у своју корист као Ц++ програмер?
Шта је ламбда израз?
Ламбда израз је такође познат као ламбда функција. То је уграђени израз са могућношћу прихватања аргумената, извршавања операција и враћања вредности, баш као типична функција.
Можете користити ламбда унутар друге функције и доделити је променљивој. Ламба функције су практичан начин дефинисања анонимног функционалног објекта у програму. Скоро сваки језик подржава ламбда, иако се свака имплементација разликује од осталих.
Који су делови Ц++ Ламбда израза?
Ламбда изрази су лаки за употребу у Ц++. Можете разложити синтаксу ламбда израза у Ц++ на следећи начин:
[цаптуре_цлаусе](параметерс) оптионс { екпрессион_боди; }
На пример:
инт вал = 13;
ауто сумПлусВал = [вал](инт а, инт б) променљивоноекцепт ->инт { повратак вал + а + б; };
сумПлусВал(2, 5); // 20
Овај код проглашава сумПлусВал променљива ауто јер ламбда израз може да прихвати и врати било који тип података. Ово оставља на компајлеру да одреди тип током компилације.
Из кода изнад, можете видети да ламбда израз садржи неколико делова који одређују како он функционише. Ево кратког прегледа сваке од ових компоненти.
-
Цаптуре цлаусе: Ово је први део ламбда израза где можете да наведете већ постојеће променљиве или дефинишете нове које ћете користити у телу израза. Постоје различити начини за одређивање снимања, на пример:
ауто аддТво = [фоо](){ повратак фоо + 2; }; // по вредности
ауто аддТхрее = [&бар](){ повратак бар + 3; }; // по референци
ауто аддАллВал = [=](){ повратак фоо + бар; }; // све по вредности
ауто аддАллРеф = [&](){ повратак фоо + бар; }; // све по референци// креирамо променљиву у клаузули цаптуре
ауто цреатеВарИнЦаптуре = [фооБар = фоо + бар](){ повратак фооБар * 5; };// нема снимања - враћа грешку јер фоо није доступан
ауто еррорЕкпрессион = [](){ повратак фоо + 2; }; - Параметри: Овај део ламбда израза је такође опциони. Садржи параметре функције које захтева ламбда. Ово се не разликује од уобичајеног начина на који бисте дефинисали параметре функције у Ц++.
-
Опције: Такође можете одредити опције када дефинишете ламбда израз. Неке опције које можете користити су: променљиво, изузетак (на пример ноекцепт у првом узорку кода), ->врста_поврата (на пример ->инт), захтева, атрибути, итд. Тхе променљиво Опција се често користи јер омогућава да се снимања могу модификовати унутар ламбда. Код испод то показује.
Иако се друге опције ретко користе, више информација о њима можете добити на цппреференце.цом страница о ламбдама.инт вредност = 10;
// враћа грешку - вредност је конст унутар израза
аутоматско смањење = [вредност](){ повратак --валуе; };
аутоматски инкремент = [вредност]() променљиво { повратак ++валуе; };
инцремент(); // 11 - Тело израза: Ово је тело ламбда израза које извршава и враћа вредност, слично као и функција. Ако је потребно, можете поделити тело ламбда израза на више од једне линије. Међутим, најбоља је пракса да буде што краћи како бисте спречили неорганизован код.
Које су предности ламбда израза?
Постоји много предности коришћења ламбда функција у вашем коду. Осим повећане брзине и ефикасности развоја, највеће предности које добијате од ламбда су следеће:
- Ламбда изрази помажу да код буде чист. Један од најбољих начина да ваш код буде једноставан и уредан је коришћење ламбда где је то могуће. Ово може бити од велике помоћи у одржавању читљиве структуре кода за вишекратну употребу.
-
Можете проследити ламбда другим функцијама као параметре. Тхе Стандардна библиотека Ц++стд:: сорт() метода користи ову погодност. Можете проследити ламбда као један од параметара ове методе да одредите како функција треба да изврши сортирање. На пример:
стд:: вектор<инт> арр = {2, 5, 1, 3, 4};
стд:: сорт (арр.бегин(), арр.енд(), [](инт а, инт б){ повратак а < б; });
// арр = {1, 2, 3, 4, 5} -
Ламбда су за вишекратну употребу. Понекад ћете можда желети да направите блок кода за вишекратну употребу у оквиру функције у вашем програму без потребе да дефинишете нову функцију. Ламбда могу бити од велике помоћи у таквим случајевима. Размотрите следећи пример ламбда израза за вишекратну употребу:
Овај програм даје следеће резултате: Овај пример показује колико је једноставно дефинисати ламбда тако да га можете користити са било којим типом.#инцлуде <иостреам>
Користећи именског просторастд;интглавни(){
// дефинишемо ламбда за вишекратну употребу
ауто аддУп = [](ауто а, ауто б, ауто ц) ноекцепт {
цоут <<"Сада сабирање... "<< а <<", "<< б <<" и "<< ц << ендл;
повратак а + б + ц;
};цоут << додај (22, 33, 44) << ендл;
цоут << аддУп (стринг("Срећна "), низ("Рођење"), низ("дан")) << ендл;
цоут << аддУп(истинито, лажно, истинито) << стд:: ендл; // извршава се као бројеви (1 и 0)
}
Коришћење Ламбда у Ц++
Постоје многе друге предности које нуде ламбда изрази, а открићете их како структура вашег програма буде све сложенија. У ствари, Ц++ програмери понекад називају ламбда изразе затварањима јер су они тако одличан начин за имплементацију затварања у коду.
Требало би да размотрите ламбда изразе ако желите да уградите модерне Ц++ концепте у своју кодну базу.