Лямбдалар жана функция объекттери
Жүрүм-турумду маалымат катары: өткөрүп берүүгө, сактоого жана бириктирүүгө боло турган чакырылуучу нерселер
operator() аныктаган объект; ал эми std::function — булардын каалаганын сактай алган универсалдуу кутуча. Чогуу алар алгоритмдерге логиканы өткөрүп берүүгө, кайра чакырууларды каттоого жана кайра колдонулуучу стратегияларды курууга мүмкүндүк берет.
- лямбданын толук синтаксисин окуй жана жаза аласыз
[captures](params) -> ret { body }, - өзгөрмөлөрдү маани боюнча, шилтеме боюнча жана баштапкы кармоо аркылуу кармай аласыз,
- функтор жаза аласыз жана лямбда кантип ага компиляцияланарын түшүндүрө аласыз,
- каалаган чакырылуучу нерсени
std::functionичине сактап, анын баасын биле аласыз.
1. Лямбда деген эмне жана эмне үчүн керек?
Лямбданы көрсөтмө жазылган стикер катары элестетиңиз. Башка жерде толук аталышы бар функция жазып, ага кайрылуунун ордуна, сиз көрсөтмөнү так ошол жерге жазып, ага муктаж болгонго бересиз. Окурман (алгоритм, агым, баскыч) аны кийинчерээк, каалаганча жолу аткара алат.
C++11ге чейин std::sort ге өзүңүздүн иреттөө тартибиңизди берүү үчүн чакыруу ордунан алыс жерде өзүнчө аталыштагы функция же функтор-структура жазууга туура келчү. Бул логиканы чачыратып, окулушту начарлатчу. Лямбда-туюнтма функцияны так ошол саптын ичинде аныктоого мүмкүндүк берет:
#include <algorithm>
#include <vector>
std::vector<int> v = {5, 2, 8, 1};
// Ичине киргизилген компаратор менен КЕМҮҮ боюнча иреттөө:
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });
// эми v = {8, 5, 2, 1}
[](int a, int b) { return a > b; } бөлүгү — бул колдонулган жеринде жазылган толук функция. Анын өзүнчө аты жок; компилятор аны сиз үчүн акырын жаратат.