Namespaces
Variants

std::ranges::views::chunk, std::ranges::chunk_view

С ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
std::ranges::chunk_view
Функции-элементы
Классы для input_ranges
Правила вывода
outer-iterator
outer-iterator::value_type
inner-iterator
 
Определён в заголовочном файле <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, поведение не определено.

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

Члены данных

Участник Описание
V base_ базовое представление
( объект-член только для демонстрации* )
ranges:: range_difference_t < V > n_ размер "чанка"
( объект-член только для демонстрации* )
Если V точно моделирует input_range ( 1 )
ranges:: range_difference_t < V > remainder_
(условно присутствует)
количество элементов, оставшихся в текущем "чанке"
( объект-член только для демонстрации* )
non-propagating-cache < ranges:: iterator_t < V >> current_
(условно присутствует)
объект, кэширующий текущий базовый итератор
( объект-член только для демонстрации* )

Функции-члены

создает chunk_view
(публичная функция-член)
возвращает копию базового (адаптированного) представления
(публичная функция-член)
возвращает итератор на начало
(публичная функция-член)
возвращает итератор или страж на конец
(публичная функция-член)
возвращает количество элементов, предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range
(публичная функция-член)
возвращает приблизительный размер результирующего 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>)

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

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

тип внешнего итератора (по "чанкам"), когда V моделирует input_range ( 1 )
( демонстрационный класс-член* )
тип внутреннего итератора (по элементам), когда 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]

Смотрите также

разделяет view на поддиапазоны между каждой парой смежных элементов, для которых заданный предикат возвращает false
(шаблон класса) (объект адаптера диапазона)
view состоящий из кортежей ссылок на смежные элементы адаптированного представления
(шаблон класса) (объект адаптера диапазона)
view чей M -й элемент является view над M -м по (M + N - 1) -й элементы другого view
(шаблон класса) (объект адаптера диапазона)