Диапазондор жана көрүнүштөр (C++20)
Маалыматтарыңыздын үстүнөн курама, жалкоо конвейерлер
<ranges> башкы файлы) маалыматтарды өзгөртүүнү конвейер оператору | менен туташтырылган кичинекей курама кадамдардын конвейери катары сүрөттөөгө мүмкүндүк берет. Ар бир кадам — бул көрүнүш (view): элементтерди кантип чыгарууну сүрөттөгөн жеңил, маалыматка ээ болбогон объект, аларды жалкоо эсептейт — бирден, сиз айланып өткөндө гана. Сиз STL контейнерлерин, итераторлорду, алгоритмдерди жана лямбдаларды билесиз; диапазондор аларды окумдуу конвейерлерге чапташтырып, шаўдуу begin()/end() жуптарын алып салат.
- диапазон жана көрүнүш эмне экенин, эмне үчүн көрүнүштөр арзан жана жалкоо экенин түшүндүрүү,
filter,transform,takeжанаdropсыяктуу диапазон адаптерлери менен конвейерлерди куруу,- диапазон алгоритмин объекттин бир талаасына багыттоо үчүн проекцияны колдонуу,
- «салаңдаган» көрүнүштөрдөн качуу үчүн ээлик жана жашоо убактысы жөнүндө ой жүгүртүү.
1. Итератор жуптарынан диапазондорго
Классикалык STL алгоритмдери итератор жубун кабыл алат. Контейнерди чыпкалоо, өзгөртүү жана басып чыгаруу үчүн begin()/end(), аралык контейнерлер жана кол менен жазылган циклдер менен алектенесиз:
// классикалык C++17: үч өтүү, бир убактылуу вектор
std::vector<int> evens;
std::copy_if(v.begin(), v.end(), std::back_inserter(evens),
[](int n){ return n % 2 == 0; });
std::vector<int> squared;
std::transform(evens.begin(), evens.end(), std::back_inserter(squared),
[](int n){ return n * n; });
Диапазон — бул жөн эле айланып өтө турган нерсе: ал begin() жана end() сунуштайт. Ар бир стандарттык контейнер — диапазон. C++20 std::ranges мейкиндигине чектелген алгоритмдерди кошот, алар бүтүндөй диапазонду бир аргумент менен кабыл алат, ошондуктан жуп жоголот:
std::ranges::sort(v); // sort(v.begin(), v.end()) ордуна
auto n = std::ranges::count(v, 42);
Андан да чоң пайда — китепкананын көрүнүштөр бөлүгү, ал ошол эки кол цикли бирдиктүү декларативдик конвейерге айландырат.