std::ranges:: views:: chunk, std::ranges:: chunk_view
|
Определено в заголовочном файле
<ranges>
|
||
|
template
<
ranges::
view
V
>
requires
ranges::
input_range
<
V
>
|
(1) | (начиная с C++23) |
|
template
<
ranges::
view
V
>
requires
ranges::
forward_range
<
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
принимает
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
.
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
(публичная функция-член) |
Наследуется от std::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
(шаблон класса) (объект адаптера диапазона) |