Spec-Zone.ru › C++

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​, поведение неопределено.

1) Реализация, поддерживающая базовое представление V, моделирующее только input_range.
2) Частичная специализация, поддерживающая базовое представление V, моделирующее forward_range или более сильные свойства. Моделирует common_range, если базовое представление V является forward_range, common_range и либо sized_range, либо не bidirectional_range.
3) Имя views::chunk обозначает объект-адаптер диапазона. Учитывая подвыражения e и n, выражение views::chunk(e, n) является эквивалентным по выражению выражению chunk_view(e, n).
4) Вычисляет наименьшее целое значение, не меньшее частного от деления num на denom. Эквивалентно:
I r = num / denom;
if (num % denom)
    ++r;
return r;

Члены данных

Член объекта Определение
base_ (private) Базовое view типа V.
(объект-член только для примера*)
n_ (private) "Размер куска" типа ranges::range_difference_t<V>.
(объект-член только для примера*)
Если V моделирует точно input_range (1)
remainder_ (private)
(необязательно)
Количество оставшихся элементов в текущем куске, типа ranges::range_difference_t<V>.
(объект-член только для примера*)
current_ (private)
(необязательно)
Нераспространяющий объект типа /*нераспространяющий-кэш*/<ranges::iterator_t<V>> для кэширования текущего базового итератора.
(объект-член только для примера*)

Члены-функции

(конструктор)
(C++23)
создаёт chunk_view
(публичный член-функция)
base
(C++23)
возвращает копию базового (адаптированного) представления
(публичный член-функция)
begin
(C++23)
возвращает итератор к началу
(публичный член-функция)
end
(C++23)
возвращает итератор или конечный маркер к концу
(публичный член-функция)
size
(C++23)
возвращает количество элементов. Представлено только если базовая (адаптированная) последовательность удовлетворяет sized_range.
(публичный член-функция)
Унаследовано от std::ranges::view_interface
empty
(C++20)
возвращает, является ли производное представление пустым. Представлено, если оно удовлетворяет sized_range или forward_range.
(публичный член-функция std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор к началу последовательности.
(публичный член-функция std::ranges::view_interface<D>)
cend
(C++23)
возвращает конечный маркер для константного итератора последовательности.
(публичный член-функция std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не является ли производное представление пустым. Представлено, если ranges::empty применимо к нему.
(публичный член-функция std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном представлении. Представлено, если оно удовлетворяет forward_range.
(публичный член-функция std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном представлении. Представлено, если оно удовлетворяет bidirectional_range и common_range.
(публичный член-функция std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-ый элемент в производном представлении. Представлено, если оно удовлетворяет random_access_range.
(публичный член-функция std::ranges::view_interface<D>)

Руководства по выводу типов

Вложенные классы

outer_iterator
(C++23)
тип выходного ("блочного") итератора, когда V моделирует input_range (1)
(член-класс только для демонстрации*)
inner_iterator
(C++23)
тип внутреннего ("элементного") итератора, когда V моделирует input_range (1)
(член-класс только для демонстрации*)
iterator
(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]

См. также

ranges::chunk_by_viewviews::chunk_by
(C++23)
разбивает view на поддиапазоны между каждой парой смежных элементов, для которых заданный предикат возвращает false
(шаблон класса) (объект адаптера диапазонов)
ranges::adjacent_viewviews::adjacent
(C++23)
view, состоящий из кортежей ссылок на смежные элементы адаптированного диапазона
(шаблон класса) (объект адаптера диапазонов)
ranges::slide_viewviews::slide
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API