Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
std::ranges::chunk_view
Member functions
Classes for input_range s
Deduction guides
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 принимает 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
(публичная функция-член)
Наследуется от 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> )

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

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

тип внешнего итератора (по "чанкам"), когда 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
(шаблон класса) (объект адаптера диапазона)