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 обозначает объект 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 (открытая функция-член) |
|
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или sentinel на конец (открытая функция-член) |
|
возвращает количество элементов; предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range (открытая функция-член) |
|
|
(C++26) | возвращает приблизительный размер результирующего диапазона approximately_sized_range (открытая функция-член) |
Унаследовано от |
|
возвращает признак того, что производное представление пусто; предоставляется только если оно удовлетворяет sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает sentinel для константного итератора диапазона (открытая функция-член 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>> =
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 <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]
См. также
|
(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/cpp/ranges/chunk_view