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 обозначает объект 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
(открытая функция-член)
base
возвращает копию базового (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или sentinel на конец
(открытая функция-член)
size
возвращает количество элементов; предоставляется только если базовый (адаптированный) диапазон удовлетворяет sized_range
(открытая функция-член)
reserve_hint
(C++26)
возвращает приблизительный размер результирующего диапазона approximately_sized_range
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; предоставляется только если оно удовлетворяет sized_range или forward_range
(открытая функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает sentinel для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
operator bool
возвращает признак того, что производное представление не пусто; предоставляется только если к нему применимо ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления; предоставляется, если оно удовлетворяет forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; предоставляется только если оно удовлетворяет bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает элемент с номером 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 >
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]

См. также

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/cpp/ranges/chunk_view

Spec-Zone.ru

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