ÐиблиоÑека диапазонов (C++20)
ÐиблиоÑека диапазонов ÑвлÑеÑÑÑ ÑаÑÑиÑением и обобÑением библиоÑек алгоÑиÑмов и иÑеÑаÑоÑов, ÑÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ моÑнÑми, ÑоÑÑавнÑми и менее подвеÑженнÑм оÑибкам.
ÐиблиоÑека ÑоздаÑÑ Ð¸ ÑпÑавлÑÐµÑ Ð¿ÑедÑÑавлениÑми диапазонов, облегÑÑннÑми обÑекÑами, коÑоÑÑе коÑвенно пÑедÑÑавлÑÑÑ Ð¸ÑеÑиÑÑемÑе поÑледоваÑелÑноÑÑи (диапазонов). ÐÐ¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ ÑÑо абÑÑÑакÑÐ¸Ñ Ð½Ð°Ð´
- паÑÑ Ð¸ÑеÑаÑоÑов [наÑало, конеÑ), напÑÐ¸Ð¼ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ, ÑозданнÑе неÑвнÑм пÑеобÑазованием из конÑейнеÑов. ÐÑе алгоÑиÑмÑ, иÑполÑзÑÑÑие паÑÑ Ð¸ÑеÑаÑоÑов, ÑепеÑÑ Ð¸Ð¼ÐµÑÑ Ð¿ÐµÑегÑÑзки, коÑоÑÑе пÑинимаÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ (напÑимеÑ, ranges::sort)
- подÑÑиÑаннÑе поÑледоваÑелÑноÑÑи [наÑало, ÑазмеÑ), Ñ.е. диапазон, возвÑаÑÑннÑй views::counted
- ÑÑловно-завеÑÑÑннÑе поÑледоваÑелÑноÑÑи [наÑало, пÑедикаÑ), напÑÐ¸Ð¼ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, возвÑаÑаемÑй views::take_while
- неогÑаниÑеннÑе поÑледоваÑелÑноÑÑи [наÑало..), напÑÐ¸Ð¼ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, возвÑаÑÑннÑй views::iota
ÐиблиоÑека диапазонов вклÑÑÐ°ÐµÑ Ð°Ð»Ð³Ð¾ÑиÑÐ¼Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð², коÑоÑÑе пÑименÑÑÑÑÑ Ðº диапазонам акÑивно, и адапÑеÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð², коÑоÑÑе пÑименÑÑÑÑÑ Ðº пÑедÑÑавлениÑм лениво. ÐдапÑеÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ñ Ð² конвейеÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸Ð»Ð¸ по меÑе повÑоÑÐµÐ½Ð¸Ñ Ð¿ÑедÑÑавлениÑ.
ÐпÑеделено в заголовоÑном Ñайле <ranges>
|
||
namespace std { namespace views = ranges::views; |
(наÑÐ¸Ð½Ð°Ñ Ñ C++20) | |
ÐÑевдоним пÑоÑÑÑанÑÑва имÑн std::views
пÑедоÑÑавлÑеÑÑÑ ÐºÐ°Ðº ÑокÑаÑение Ð´Ð»Ñ std::ranges::views
.
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² пÑоÑÑÑанÑÑве имÑн
std::ranges | |
ÐоÑÑÑп к диапазонам | |
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² заголовоÑном Ñайле
<ranges> | |
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² заголовоÑном Ñайле
<iterator> | |
(C++20) |
возвÑаÑÐ°ÐµÑ Ð¸ÑеÑаÑÐ¾Ñ Ð½Ð° наÑало диапазона (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ð¾Ð³ÑаниÑиÑелÑ, ÑказÑваÑÑий на ÐºÐ¾Ð½ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ð¸ÑеÑаÑÐ¾Ñ Ð½Ð° наÑало диапазона ÑолÑко Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ð¾Ð³ÑаниÑиÑелÑ, ÑказÑваÑÑий на ÐºÐ¾Ð½ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°, доÑÑÑпного ÑолÑко Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑаÑнÑй иÑеÑаÑÐ¾Ñ Ð½Ð° диапазон (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑаÑнÑй конеÑнÑй иÑеÑаÑÐ¾Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑаÑнÑй иÑеÑаÑÐ¾Ñ Ð½Ð° диапазон ÑолÑко Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑаÑнÑй конеÑнÑй иÑеÑаÑÐ¾Ñ Ð½Ð° диапазон ÑолÑко Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ñелое ÑиÑло, Ñавное ÑазмеÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
возвÑаÑÐ°ÐµÑ Ñелое ÑиÑло Ñо знаком, Ñавное ÑазмеÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
пÑовеÑÑеÑ, пÑÑÑ Ð»Ð¸ диапазон (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
полÑÑÐ°ÐµÑ ÑказаÑÐµÐ»Ñ Ð½Ð° наÑало непÑеÑÑвного диапазона (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
(C++20) |
полÑÑÐ°ÐµÑ ÑказаÑÐµÐ»Ñ Ð½Ð° наÑало непÑеÑÑвного диапазона, доÑÑÑпного ÑолÑко Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
ÐÑимиÑÐ¸Ð²Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð² | |
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² заголовоÑном Ñайле
<ranges> | |
полÑÑÐ°ÐµÑ ÑвÑзаннÑе ÑÐ¸Ð¿Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° (пÑевдоним Ñаблона) | |
ÐбÑабоÑка виÑÑÑÐ¸Ñ Ð¸ÑеÑаÑоÑов | |
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² заголовоÑном Ñайле
<ranges> | |
(C++20) |
Ñип заполниÑелÑ, ÑказÑваÑÑий, ÑÑо иÑеÑаÑÐ¾Ñ Ð¸Ð»Ð¸ поддиапазон не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑенÑ, Ñак как они бÑдÑÑ Ð²Ð¸ÑÑÑими (клаÑÑ) |
полÑÑÐ°ÐµÑ Ñип иÑеÑаÑоÑа или Ñип поддиапазона из borrowed_range (пÑевдоним Ñаблона) | |
ÐонÑепÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð² | |
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² заголовоÑном Ñайле
<ranges> | |
(C++20) |
ÑказÑваеÑ, ÑÑо Ñип ÑвлÑеÑÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð¼, Ñо еÑÑÑ Ð¿ÑедоÑÑавлÑÐµÑ Ð¸ÑеÑаÑÐ¾Ñ begin и огÑаниÑиÑÐµÐ»Ñ end (конÑепÑ) |
(C++20) |
ÑказÑваеÑ, ÑÑо Ñип ÑвлÑеÑÑÑ range, и иÑеÑаÑоÑÑ, полÑÑеннÑе из его вÑÑажениÑ, могÑÑ Ð±ÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно возвÑаÑÐµÐ½Ñ Ð±ÐµÐ· опаÑноÑÑи завиÑÐ°Ð½Ð¸Ñ (конÑепÑ) |
(C++20) |
ÑказÑваеÑ, ÑÑо диапазон ÑзнаÑÑ Ñвой ÑÐ°Ð·Ð¼ÐµÑ Ð·Ð° конÑÑанÑное вÑÐµÐ¼Ñ (конÑепÑ) |
(C++20) |
ÑказÑваеÑ, ÑÑо диапазон ÑвлÑеÑÑÑ Ð¿ÑедÑÑавлением, Ñо еÑÑÑ Ð¸Ð¼ÐµÐµÑ Ð¿Ð¾ÑÑоÑнное вÑÐµÐ¼Ñ ÐºÐ¾Ð¿Ð¸ÑованиÑ/пеÑемеÑениÑ/пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ (конÑепÑ) |
(C++20) |
ÑказÑÐ²Ð°ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, Ñип иÑеÑаÑоÑа коÑоÑого ÑооÑвеÑÑÑвÑÐµÑ input_iterator (конÑепÑ) |
(C++20) |
ÑказÑÐ²Ð°ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, Ñип иÑеÑаÑоÑа коÑоÑого ÑооÑвеÑÑÑвÑÐµÑ output_iterator (конÑепÑ) |
(C++20) |
ÑказÑÐ²Ð°ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, Ñип иÑеÑаÑоÑа коÑоÑого ÑооÑвеÑÑÑвÑÐµÑ forward_iterator (конÑепÑ) |
(C++20) |
ÑказÑÐ²Ð°ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, Ñип иÑеÑаÑоÑа коÑоÑого ÑооÑвеÑÑÑвÑÐµÑ bidirectional_iterator (конÑепÑ) |
(C++20) |
ÑказÑÐ²Ð°ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, Ñип иÑеÑаÑоÑа коÑоÑого ÑооÑвеÑÑÑвÑÐµÑ random_access_iterator (конÑепÑ) |
(C++20) |
ÑказÑÐ²Ð°ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, Ñип иÑеÑаÑоÑа коÑоÑого ÑооÑвеÑÑÑвÑÐµÑ contiguous_iterator (конÑепÑ) |
(C++20) |
ÑказÑваеÑ, ÑÑо диапазон Ð¸Ð¼ÐµÐµÑ Ð¸Ð´ÐµÐ½ÑиÑнÑе ÑÐ¸Ð¿Ñ Ð¸ÑеÑаÑоÑа и огÑаниÑиÑÐµÐ»Ñ (конÑепÑ) |
(C++20) |
опÑеделÑÐµÑ ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº range Ð´Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñного пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² view (конÑепÑ) |
ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ | |
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² заголовоÑном Ñайле
<ranges> | |
(C++20) |
Ñаблон вÑпомогаÑелÑного клаÑÑа Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ view, иÑполÑзÑÑ Ð»ÑбопÑÑно повÑоÑÑÑÑийÑÑ Ð¾Ð±ÑÐ°Ð·ÐµÑ Ñаблон (Ñаблон клаÑÑа) |
(C++20) |
обÑединÑÐµÑ Ð¿Ð°ÑÑ Ð¸ÑеÑаÑоÑ-огÑаниÑиÑÐµÐ»Ñ Ð² view (Ñаблон клаÑÑа) |
[пÑавиÑÑ] ФабÑики диапазонов
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² заголовоÑном Ñайле
<ranges> | |
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² пÑоÑÑÑанÑÑве имÑн
std::ranges | |
пÑÑÑой view без ÑлеменÑов (Ñаблон клаÑÑа) (ÑÐ°Ð±Ð»Ð¾Ð½Ð½Ð°Ñ Ð¿ÐµÑеменнаÑ) | |
view, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñказанного знаÑÐµÐ½Ð¸Ñ (Ñаблон клаÑÑа) (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) | |
(C++20) |
view, ÑоÑÑоÑÑий из поÑледоваÑелÑноÑÑи, ÑгенеÑиÑованной пÑÑÑм многокÑаÑного ÑвелиÑÐµÐ½Ð¸Ñ Ð½Ð°ÑалÑного знаÑÐµÐ½Ð¸Ñ (Ñаблон клаÑÑа) (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
view, ÑоÑÑоÑÑий из ÑлеменÑов, полÑÑеннÑÑ
поÑледоваÑелÑнÑм пÑименением operator>> к ÑооÑвеÑÑÑвÑÑÑÐµÐ¼Ñ Ð²Ñ
Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¿Ð¾ÑÐ¾ÐºÑ (Ñаблон клаÑÑа) (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
[пÑавиÑÑ] ÐдапÑеÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð²
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² заголовоÑном Ñайле
<ranges> | |
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² пÑоÑÑÑанÑÑве имÑн
std::ranges | |
(C++20) |
view, коÑоÑÑй вклÑÑÐ°ÐµÑ Ð²Ñе ÑлеменÑÑ range (пÑевдоним Ñаблона) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) |
(C++20) |
view из ÑлеменÑов некоÑоÑого дÑÑгого range (Ñаблон клаÑÑа) |
(C++20) |
view Ñ ÑникалÑнÑм владелÑÑем некоÑоÑого range (Ñаблон клаÑÑа) |
view, коÑоÑÑй ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑлеменÑов range, коÑоÑÑй ÑооÑвеÑÑÑвÑÐµÑ Ð¿ÑедикаÑÑ (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
view поÑледоваÑелÑноÑÑи, коÑоÑÐ°Ñ Ð¿ÑименÑÐµÑ ÑÑнкÑÐ¸Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
(C++20) |
view, ÑоÑÑоÑÑий из пеÑвÑÑ
N ÑлеменÑов дÑÑгого view (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) |
view, ÑоÑÑоÑÑий из наÑалÑнÑÑ
ÑлеменÑов дÑÑгого view, до пеÑвого ÑлеменÑа, Ð´Ð»Ñ ÐºÐ¾ÑоÑого пÑÐµÐ´Ð¸ÐºÐ°Ñ Ð½Ðµ веÑнÑÑ false (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
(C++20) |
view, ÑоÑÑоÑÑий из ÑлеменÑов дÑÑгого view, пÑопÑÑÐºÐ°Ñ Ð¿ÐµÑвÑе N ÑлеменÑов (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) |
view, ÑоÑÑоÑÑий из ÑлеменÑов дÑÑгого view, пÑопÑÑÐºÐ°Ñ Ð½Ð°ÑалÑнÑÑ Ð¿Ð¾Ð´Ð¿Ð¾ÑледоваÑелÑноÑÑÑ ÑлеменÑов до пеÑвого ÑлеменÑа, Ð´Ð»Ñ ÐºÐ¾ÑоÑого пÑÐµÐ´Ð¸ÐºÐ°Ñ Ð²ÐµÑÐ½ÐµÑ false (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
(C++20) |
view, ÑоÑÑоÑÑий из поÑледоваÑелÑноÑÑи, полÑÑенной ÑплоÑнением view, ÑоÑÑоÑÑего из range (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) |
view по поддиапазонам, полÑÑеннÑм в ÑезÑлÑÑаÑе ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´ÑÑгого view Ñ Ð¸ÑполÑзованием ÑазделиÑÐµÐ»Ñ (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
view по поддиапазонам, полÑÑеннÑм в ÑезÑлÑÑаÑе ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´ÑÑгого view Ñ Ð¸ÑполÑзованием ÑазделиÑÐµÐ»Ñ (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
(C++20) |
ÑоздаÑÑ Ð¿Ð¾Ð´Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ из иÑеÑаÑоÑа и ÑÑÑÑÑика (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
пÑеобÑазÑÐµÑ view в common_range (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
view, коÑоÑÑй пеÑебиÑÐ°ÐµÑ ÑлеменÑÑ Ð´ÑÑгого двÑнапÑавленного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² обÑаÑном поÑÑдке (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ view, ÑоÑÑоÑÑий из знаÑений, подобнÑÑ
коÑÑежÑ, и ÑиÑла N, и ÑоздаÑÑ view из N-го ÑлеменÑа каждого коÑÑежа (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
(C++20) |
пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ view, ÑоÑÑоÑÑий из паÑнÑÑ
знаÑений, и ÑоздаÑÑ view пеÑвÑÑ
ÑлеменÑов каждой паÑÑ (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) |
пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ view, ÑоÑÑоÑÑий из паÑнÑÑ
знаÑений, и ÑоздаÑÑ view из вÑоÑÑÑ
ÑлеменÑов каждой паÑÑ (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
(C++23) |
view, ÑоÑÑоÑÑий из коÑÑежей ÑÑÑлок на ÑооÑвеÑÑÑвÑÑÑие ÑлеменÑÑ Ð°Ð´Ð°Ð¿ÑиÑованнÑÑ
пÑедÑÑавлений (Ñаблон клаÑÑа) (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) |
view, ÑоÑÑоÑÑий из коÑÑежей ÑезÑлÑÑаÑов пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑнкÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº ÑооÑвеÑÑÑвÑÑÑим ÑлеменÑам адапÑиÑованнÑÑ
пÑедÑÑавлений (Ñаблон клаÑÑа) (обÑÐµÐºÑ ÑоÑки наÑÑÑойки) | |
view, ÑоÑÑоÑÑий из коÑÑежей ÑÑÑлок на ÑоÑедние ÑлеменÑÑ Ð°Ð´Ð°Ð¿ÑиÑованного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) | |
view, ÑоÑÑоÑÑий из коÑÑежей ÑезÑлÑÑаÑов пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑнкÑии пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº ÑмежнÑм ÑлеменÑам адапÑиÑованного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (Ñаблон клаÑÑа) (обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона) |
ÐекоÑоÑÑе адапÑеÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð² заклÑÑаÑÑ Ñвои ÑлеменÑÑ Ð¸Ð»Ð¸ обÑекÑÑ ÑÑнкÑии в ÑпоÑобнÑÑ Ðº копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ð¾Ð»Ð¾ÑкÑ.
[пÑавиÑÑ] ÐбÑекÑÑ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов
ÐбÑекÑÑ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов ÑÑо обÑекÑÑ ÑоÑки наÑÑÑойки, коÑоÑÑе пÑинимаÑÑ viewable_range в каÑеÑÑве ÑÐ²Ð¾Ð¸Ñ Ð¿ÐµÑвÑÑ Ð°ÑгÑменÑов и возвÑаÑаÑÑ view. ÐекоÑоÑÑе обÑекÑÑ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов ÑвлÑÑÑÑÑ ÑнаÑнÑми, Ñ.е. они пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ viewable_range в каÑеÑÑве единÑÑвенного аÑгÑменÑа. ÐÑÑгие обÑекÑÑ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов пÑинимаÑÑ viewable_range и дÑÑгие завеÑÑаÑÑие аÑгÑменÑÑ.
ÐÑли обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð±Ð¾Ð»ÐµÐµ одного аÑгÑменÑа, он Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑаÑÑиÑное пÑименение:
- пÑÑÑÑ
a
бÑÐ´ÐµÑ Ñаким обÑекÑом адапÑеÑа диапазона, и - args... бÑÐ´ÐµÑ Ð°ÑгÑменÑами (обÑÑно Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑаÑÑÐ¸Ñ Ð°ÑгÑменÑов),
вÑÑажение a(args...) Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑие ÑвойÑÑва:
- оно дейÑÑвиÑелÑно Ñогда и ÑолÑко Ñогда, когда Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ аÑгÑменÑа e в args... Ñакого ÑÑо
E
Ñавно decltype((e)), std::is_constructible_v<std::decay_t<E>, E> Ñавно true, - когда вÑзов дейÑÑвиÑелен, его обÑÐµÐºÑ ÑезÑлÑÑаÑа ÑÐ¾Ñ ÑанÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±ÑÐµÐºÑ Ñипа std::decay_t<E> иниÑиализиÑованнÑй напÑÑмÑÑ Ð±ÐµÐ· ÑпиÑка Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ std::forward<E>(e), Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ аÑгÑменÑа e в args... (дÑÑгими Ñловами, обÑекÑÑ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов ÑвÑзÑваÑÑ Ð°ÑгÑменÑÑ Ð¿Ð¾ знаÑениÑ), и
- обÑÐµÐºÑ ÑезÑлÑÑаÑа ÑÑо обÑÐµÐºÑ Ð·Ð°Ð¼ÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑа диапазона (ÑмоÑÑиÑе ниже).
Ðак и дÑÑгие обÑекÑÑ ÑоÑки наÑÑÑойки, пÑÑÑÑ
-
a
бÑÐ´ÐµÑ Ð¾Ð±ÑекÑом cv-неквалиÑиÑиÑованной веÑÑии Ñипа лÑбÑÑ Ð¾Ð±ÑекÑов адапÑеÑов диапазонов, - args... бÑÐ´ÐµÑ Ð»Ñбой гÑÑппой аÑгÑменÑов, ÑооÑвеÑÑÑвÑÑÑиÑ
огÑаниÑениÑм operator() Ñипа
a
,
вÑзовÑ
- a(args...),
- std::as_const(a)(args...),
- std::move(a)(args...), and
- std::move(std::as_const(a))(args...)
ÑквиваленÑнÑ.
ÐбÑекÑом ÑезÑлÑÑаÑа каждого из ÑÑÐ¸Ñ Ð²ÑÑажений ÑвлÑеÑÑÑ Ð»Ð¸Ð±Ð¾ обÑÐµÐºÑ view, либо обÑÐµÐºÑ Ð·Ð°Ð¼ÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑа диапазона.
ÐÑимеÑаниÑ: operator() не поддеÑживаеÑÑÑ Ð´Ð»Ñ Ð²ÐµÑÑий Ñипов обÑекÑов адапÑеÑов диапазонов, квалиÑиÑиÑованнÑÑ ÐºÐ°Ðº volatile или const volatile. ÐÑи ÑвÑзÑвании маÑÑÐ¸Ð²Ñ Ð¸ ÑÑнкÑии пÑеобÑазÑÑÑÑÑ Ð² ÑказаÑели.
[пÑавиÑÑ] ÐбÑекÑÑ Ð·Ð°Ð¼ÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов
ÐбÑекÑÑ Ð·Ð°Ð¼ÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов ÑÑо обÑекÑÑ, Ñип коÑоÑÑÑ ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ñипом одного из ÑледÑÑÑÐ¸Ñ Ð¾Ð±ÑекÑов (без ÑÑÑÑа cv-квалиÑикаÑии):
- ÑнаÑнÑе обÑекÑÑ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов,
- ÑезÑлÑÑаÑÑ Ð¿ÑивÑзки конеÑнÑÑ Ð°ÑгÑменÑов обÑекÑами адапÑеÑов диапазонов, и
- ÑезÑлÑÑаÑÑ Ð¾Ð±ÑÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð²ÑÑ Ð¾Ð±ÑекÑов замÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ operator|.
ÐбÑекÑÑ Ð·Ð°Ð¼ÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ viewable_range в каÑеÑÑве единÑÑвенного аÑгÑменÑа и возвÑаÑаÑÑ view. ÐÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа конвейеÑа: еÑли C обÑÐµÐºÑ Ð·Ð°Ð¼ÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑа диапазона, а R ÑÑо viewable_range, ÑÑи два вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑквиваленÑнÑ:
C(R) R | C
ÐÑÐ¾Ñ Ð²Ñзов пеÑенапÑавлÑÐµÑ ÑвÑзаннÑе аÑгÑменÑÑ (еÑли еÑÑÑ) в ÑвÑзаннÑй обÑÐµÐºÑ Ð°Ð´Ð°Ð¿ÑеÑа диапазона. Ð ÑÑом вÑзове ÑвÑзаннÑе аÑгÑменÑÑ Ð² C (еÑли еÑÑÑ) иденÑиÑно обÑабаÑÑваÑÑÑÑ ÐºÐ°Ðº левоÑÑоÑоннее или пÑавоÑÑоÑоннее знаÑение и cv-квалиÑиÑиÑÐ¾Ð²Ð°Ð½Ñ ÐºÐ°Ðº C.
Ðва обÑекÑа замÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов могÑÑ Ð±ÑÑÑ ÑвÑÐ·Ð°Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ operator| Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´ÑÑгого обÑекÑа замÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов: еÑли C и D ÑвлÑÑÑÑÑ Ð¾Ð±ÑекÑами замÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов, Ñо C | D Ñакже ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом замÑÐºÐ°Ð½Ð¸Ñ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов, еÑли ÑÑо допÑÑÑимо.
СвÑзаннÑе аÑгÑменÑÑ C | D опÑеделÑÑÑÑÑ ÑледÑÑÑим обÑазом:
- в обÑекÑе ÑезÑлÑÑаÑа еÑÑÑ ÑÑбÑÐµÐºÑ Ñого же Ñипа (cv-квалиÑикаÑÐ¸Ñ Ð¾ÑбÑоÑена) Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ подобÑекÑа в Ð¾Ð±Ð¾Ð¸Ñ Ð¾Ð¿ÐµÑÐ°Ð½Ð´Ð°Ñ , коÑоÑÑй ÑвлÑеÑÑÑ ÑвÑзаннÑм аÑгÑменÑом,
- Ñакой ÑвÑзаннÑй аÑгÑÐ¼ÐµÐ½Ñ Ð¸Ð½Ð¸ÑиализиÑÑеÑÑÑ Ð½Ð°Ð¿ÑÑмÑÑ, без ÑпиÑка иниÑиализаÑии, Ñ Ð¸ÑÑ Ð¾Ð´Ð½Ñм подобÑекÑом в ÑодеÑжаÑем его опеÑанде, где иÑÑоÑник иденÑиÑно обÑабаÑÑваеÑÑÑ ÐºÐ°Ðº левоÑÑоÑоннее или пÑавоÑÑоÑоннее знаÑение и cv-квалиÑиÑиÑÑеÑÑÑ ÐºÐ°Ðº опеÑанд,
- ÑезÑлÑÑÐ°Ñ Ð´ÐµÐ¹ÑÑвиÑелен Ñогда и ÑолÑко Ñогда, когда пÑавилÑна иниÑиализаÑÐ¸Ñ Ð²ÑÐµÑ ÑвÑзаннÑÑ Ð°ÑгÑменÑов.
ÐÑÑÐµÐºÑ Ð¸ валидноÑÑÑ ÑезÑлÑÑаÑа operator() опÑеделÑеÑÑÑ ÑледÑÑÑим обÑазом: пÑи viewable_range R ÑÑи два вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑквиваленÑÐ½Ñ (оба пÑавилÑно или непÑавилÑно ÑÑоÑмиÑованÑ):
R | C | D // (R | C) | D R | (C | D)
ÐÑимеÑание: operator() не поддеÑживаеÑÑÑ Ð´Ð»Ñ Ð²ÐµÑÑий Ñипов замÑÐºÐ°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов адапÑеÑов диапазонов Ñ ÐºÐ²Ð°Ð»Ð¸ÑикаÑией volatile или const volatile.
[пÑавиÑÑ] ÐÑпомогаÑелÑнÑе конÑепÑÑ
СледÑÑÑие конÑепÑÑ ÑолÑко Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¸ иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ Ñипов, но они не ÑвлÑÑÑÑÑ ÑаÑÑÑми инÑеÑÑейÑа ÑÑандаÑÑной библиоÑеки.
template<class R> concept __SimpleView = // ÑолÑко ÑазÑÑÑнение |
||
[пÑавиÑÑ] ÐÑимеÑание
ÐакÑÐ¾Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑионалÑноÑÑи: __cpp_lib_ranges
[пÑавиÑÑ] ÐÑимеÑ
#include <ranges> #include <iostream> int main() { auto const ints = {0,1,2,3,4,5}; auto even = [](int i) { return 0 == i % 2; }; auto square = [](int i) { return i * i; }; // "конвейеÑнÑй" ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑедÑÑавлений: for (int i : ints | std::views::filter(even) | std::views::transform(square)) { std::cout << i << ' '; } std::cout << '\n'; // ÑÑадиÑионнÑй "ÑÑнкÑионалÑнÑй" ÑинÑакÑÐ¸Ñ ÑоÑÑавлениÑ: for (int i : std::views::transform(std::views::filter(ints, even), square)) { std::cout << i << ' '; } }
ÐÑвод:
0 4 16 0 4 16
[пÑавиÑÑ] ÐÑÑÑÑÑ Ð¾ деÑекÑаÑ
СледÑÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð±Ñли пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ñ Ñ Ð¾Ð±ÑаÑной Ñилой к Ñанее опÑбликованнÑм ÑÑандаÑÑам C++:
ÐÐ¾Ð¼ÐµÑ | ÐÑименÑн | Ðоведение в ÑÑандаÑÑе | ÐоÑÑекÑное поведение |
---|---|---|---|
LWG 3509 | C++20 | бÑло неÑÑно, как обÑекÑÑ Ð°Ð´Ð°Ð¿ÑеÑов диапазонов ÑвÑзÑваÑÑ ÐºÐ¾Ð½ÐµÑнÑе аÑгÑменÑÑ | они ÑвÑÐ·Ð°Ð½Ñ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ |