std::ranges::views::chunk, std::ranges::chunk_view
| Определён в заголовочном файле <ranges>
|
||
template< ranges::view V >
requires ranges::input_range<V>
class chunk_view
: public ranges::view_interface<chunk_view<V>>
|
(1) | (начиная с C++23) |
template< ranges::view V >
requires ranges::forward_range<V>
class chunk_view<V>
: public ranges::view_interface<chunk_view<V>>
|
(2) | (начиная с C++23) |
namespace views {
inline constexpr /* unspecified */ chunk = /* unspecified */;
}
|
(3) | (начиная с C++23) |
| Сигнатура вызова |
||
template< ranges::viewable_range R >
constexpr ranges::view auto chunk( R&& r, ranges::range_difference_t<R> n );
|
(начиная с C++23) | |
template< class DifferenceType >
constexpr /*range adaptor closure*/ chunk( DifferenceType&& n );
|
(начиная с C++23) | |
| Вспомогательные шаблоны |
||
template< class I >
constexpr I /*div-ceil*/( I num, I denom );
|
(4) | (только для демонстрации*) |
chunk_view принимает представление и число n и создаёт диапазон представлений (блоков ) исходного представления, где каждый блок , кроме, возможно, последнего, имеет размер n. Эти блоки являются непересекающимися последовательными поддиапазонами элементов исходного представления, расположенными по порядку.
Пусть s — размер исходного представления. Если s не кратно n, размер последнего созданного представления равен в точности s % n (остаток). В противном случае размер каждого блока , включая последний, равен n.
Размер созданного представления равен /*div-ceil*/(s).
Если n не больше 0, поведение не определено.
V, которое моделирует forward_range или более сильное. Моделирует common_range, если базовое представление V является forward_range, common_range и либо sized_range, либо не bidirectional_range.views::chunk обозначает RangeAdaptorObject. Для заданных подвыражений e и n выражение views::chunk(e, n) эквивалентно-выражению для chunk_view(e, n).num на denom. Эквивалентно:
I r = num / denom;
if (num % denom)
++r;
return r;
Члены данных
| Участник | Описание |
V
base_
|
базовое представление
( объект-член только для демонстрации* ) |
ranges::
range_difference_t
<
V
>
n_
|
размер "чанка"
( объект-член только для демонстрации* ) |
Если
|
|
ranges::
range_difference_t
<
V
>
remainder_
(условно присутствует) |
количество элементов, оставшихся в текущем "чанке"
( объект-член только для демонстрации* ) |
non-propagating-cache
<
ranges::
iterator_t
<
V
>>
current_
(условно присутствует) |
объект, кэширующий текущий базовый итератор
( объект-член только для демонстрации* ) |
Функции-члены
создает
chunk_view
(публичная функция-член) |
|
|
возвращает копию базового (адаптированного) представления
(публичная функция-член) |
|
|
возвращает итератор на начало
(публичная функция-член) |
|
|
возвращает итератор или страж на конец
(публичная функция-член) |
|
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет
sized_range
(публичная функция-член) |
|
|
(C++26)
|
возвращает приблизительный размер результирующего
approximately_sized_range
(публичная функция-член) |
Унаследовано от ranges::view_interface | |
| возвращает, является ли производное представление пустым, только если оно удовлетворяет sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>)
| |
(C++23) |
возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>)
|
(C++23) |
возвращает страж для константного итератора диапазона (открытая функция-член std::ranges::view_interface<D>)
|
| возвращает, не является ли производное представление пустым, только если ranges::empty применима к нему (открытая функция-член std::ranges::view_interface<D>)
| |
| возвращает первый элемент в производном представлении, при условии, что оно удовлетворяет forward_range (открытая функция-член std::ranges::view_interface<D>)
| |
| возвращает последний элемент в производном представлении, только если оно удовлетворяет bidirectional_range и common_range (открытая функция-член std::ranges::view_interface<D>)
| |
возвращает n-й элемент в производном представлении, только если оно удовлетворяет random_access_range (открытая функция-член std::ranges::view_interface<D>)
| |
Руководства по выводу
Вложенные классы
|
(C++23)
|
тип внешнего итератора (по "чанкам"), когда
V
моделирует
input_range
(
1
)
( демонстрационный класс-член* ) |
|
(C++23)
|
тип внутреннего итератора (по элементам), когда
V
моделирует
input_range
(
1
)
( демонстрационный класс-член* ) |
|
(C++23)
|
тип итератора, когда
V
моделирует
forward_range
(
2
)
( демонстрационный шаблон класса-члена* ) |
Вспомогательные шаблоны
|
template
<
class
V
>
constexpr
bool
ranges::
enable_borrowed_range
<
chunk_view
<
V
>>
=
|
(начиная с C++23) | |
Эта специализация
ranges::enable_borrowed_range
позволяет
chunk_view
удовлетворять требованиям
borrowed_range
, когда базовое представление
V
удовлетворяет одновременно и
forward_range
, и
borrowed_range
.
Примечания
Если
V
моделирует
input_range
(
1
)
,
то итератор
chunk_view
имеет специальный тип:
outer_iterator::value_type
, который сам является входным представлением.
Если
V
моделирует
forward_range
или более строгий диапазон
(
2
)
,
chunk_view
делегирует
views::take
определение своего
value_type
.
Если
V
моделирует
bidirectional_range
или более строгие диапазоны
(
2
)
, необходимость корректного вычисления размера последнего чанка (с конца
итератора
) требует, чтобы базовый тип диапазона
V
был
sized_range
.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_ranges_chunk
|
202202L
|
(C++23) |
std::ranges::chunk_view
|
Пример
#include <algorithm> #include <initializer_list> #include <iostream> #include <ranges> auto print_subrange = [](std::ranges::viewable_range auto&& r) { std::cout << '['; for (int pos{}; auto elem : r) std::cout << (pos++ ? " " : "") << elem; std::cout << "] "; }; int main() { const auto v = {1, 2, 3, 4, 5, 6}; for (const unsigned width : std::views::iota(1U, 2U + v.size())) { auto const chunks = v | std::views::chunk(width); std::cout << "chunk(" << width << "): "; std::ranges::for_each(chunks, print_subrange); std::cout << '\n'; } }
Вывод:
chunk(1): [1] [2] [3] [4] [5] [6] chunk(2): [1 2] [3 4] [5 6] chunk(3): [1 2 3] [4 5 6] chunk(4): [1 2 3 4] [5 6] chunk(5): [1 2 3 4 5] [6] chunk(6): [1 2 3 4 5 6] chunk(7): [1 2 3 4 5 6]
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
- 26.7.28 Представление чанков [range.chunk]
Смотрите также
разделяет
view
на поддиапазоны между каждой парой смежных элементов, для которых заданный предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |
|
view
состоящий из кортежей ссылок на смежные элементы адаптированного представления
(шаблон класса) (объект адаптера диапазона) |
|
|
(C++23)
|
view
чей M
-й
элемент является
view
над M
-м
по (M + N - 1)
-й
элементы другого
view
(шаблон класса) (объект адаптера диапазона) |