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 принимает 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 обозначает объект-адаптер диапазона. Учитывая подвыражения e и n, выражение views::chunk(e, n) является эквивалентным по выражению выражению chunk_view(e, n).num на denom. Эквивалентно: I r = num / denom;
if (num % denom)
++r;
return r;Члены данных
| Член объекта | Определение |
|---|---|
base_ (private) | Базовое view типа V.(объект-член только для примера*) |
n_ (private) | "Размер куска" типа ranges::range_difference_t<V>.(объект-член только для примера*) |
Если |
|
remainder_ (private) (необязательно) | Количество оставшихся элементов в текущем куске, типа ranges::range_difference_t<V>.(объект-член только для примера*) |
current_ (private) (необязательно) | Нераспространяющий объект типа /*нераспространяющий-кэш*/<ranges::iterator_t<V>> для кэширования текущего базового итератора. (объект-член только для примера*) |
Члены-функции
|
(C++23) | создаёт chunk_view (публичный член-функция) |
|
(C++23) | возвращает копию базового (адаптированного) представления (публичный член-функция) |
|
(C++23) | возвращает итератор к началу (публичный член-функция) |
|
(C++23) | возвращает итератор или конечный маркер к концу (публичный член-функция) |
|
(C++23) | возвращает количество элементов. Представлено только если базовая (адаптированная) последовательность удовлетворяет sized_range. (публичный член-функция) |
Унаследовано от |
|
|
(C++20) | возвращает, является ли производное представление пустым. Представлено, если оно удовлетворяет sized_range или forward_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++23) | возвращает константный итератор к началу последовательности. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++23) | возвращает конечный маркер для константного итератора последовательности. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает, не является ли производное представление пустым. Представлено, если ranges::empty применимо к нему. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает первый элемент в производном представлении. Представлено, если оно удовлетворяет forward_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает последний элемент в производном представлении. Представлено, если оно удовлетворяет bidirectional_range и common_range. (публичный член-функция std::ranges::view_interface<D>) |
|
(C++20) | возвращает 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 >
inline constexpr bool ranges::enable_borrowed_range<chunk_view<V>> =
ranges::forward_range<V> && ranges::enable_borrowed_range<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 <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:2023):
- 26.7.28 Chunk view [range.chunk]
См. также
|
(C++23) | разбивает view на поддиапазоны между каждой парой смежных элементов, для которых заданный предикат возвращает false(шаблон класса) (объект адаптера диапазонов) |
|
(C++23) | view, состоящий из кортежей ссылок на смежные элементы адаптированного диапазона(шаблон класса) (объект адаптера диапазонов) |
|
(C++23) | view, чьей M-й элемент является view над элементами с M-го по (M + N - 1)-й другого view(шаблон класса) (объект адаптера диапазонов) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/chunk_view