Spec-Zone.ru › C++

std::ranges::views::chunk_by, std::ranges::chunk_by_view

Определено в заголовке <ranges>
template< ranges::forward_range V, std::indirect_binary_predicate<iterator_t<V>,
          ranges::iterator_t<V>> Pred >
    requires ranges::view<V> && std::is_object_v<Pred>
class chunk_by_view
    : public ranges::view_interface<chunk_by_view<V, Pred>>
(1) (с C++23)
namespace views {
    inline constexpr /* unspecified */ chunk_by = /* unspecified */ ;
}
(2) (с C++23)
Подпись вызова
template< ranges::viewable_range R, class Pred >
    requires /* see below */
constexpr ranges::view auto chunk_by( R&& r, Pred&& pred );
(с C++23)
template< class Pred >
constexpr /*range adaptor closure*/ chunk_by( Pred&& pred );
(с C++23)
1) chunk_by_view — адаптер диапазона, который принимает view и вызываемый объект pred (бинарный предикат), и создаёт view поддиапазонов (кусков), разделяя основной диапазон между каждой парой смежных элементов, для которых pred возвращает false. Первый элемент каждой такой пары принадлежит предыдущему куску, а второй — следующему.
2) Имя views::chunk_by обозначает RangeAdaptorObject. Учитывая подвыражение e и f, выражение views::chunk_by(e, f) эквивалентно выражению chunk_by_view(e, f).

chunk_by_view всегда моделирует forward_range, и моделирует bidirectional_range и/или common_range, если адаптируемый view тип моделирует соответствующие концепции. chunk_by_view никогда не моделирует borrowed_range или sized_range.

Члены данных

Объект-член Определение
base_ (private) Основной view типа V.
(только для иллюстрации*)
pred_ (private) Объект типа movable-box<Pred>, который оборачивает предикат, используемый для разделения элементов base_.
(только для иллюстрации*)
begin_ (private) подобный опционалу объект, кеширующий итератор первого элемента.
(только для иллюстрации*)

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

(конструктор)
(C++23)
создаёт chunk_by_view
(общедоступная функция-член)
base
(C++23)
возвращает копию основного (адаптированного) диапазона
(общедоступная функция-член)
pred
(C++23)
возвращает ссылку на сохранённый предикат
(общедоступная функция-член)
begin
(C++23)
возвращает итератор начала
(общедоступная функция-член)
end
(C++23)
возвращает итератор или конечную точку конца
(общедоступная функция-член)
find_next
(C++23)
возвращает итератор начала следующего поддиапазона
(только для иллюстрации*)
find_prev
(C++23)
возвращает итератор начала предыдущего поддиапазона
(только для иллюстрации*)
Унаследовано от 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>)

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

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

итератор
(C++23)
тип итератора
(только для иллюстрации*)

Примечания

Для обеспечения амортизированной постоянной временной сложности, требуемой концепцией range, результат begin() кэшируется в объекте chunk_by_view. Если базовый диапазон изменяется после первого вызова begin(), последующее использование объекта chunk_by_view может иметь неинтуитивное поведение.

Макрос проверки наличия функции Значение Std Функция
__cpp_lib_ranges_chunk_by 202202L (C++23) std::ranges::chunk_by_view

Пример

#include <functional>
#include <iostream>
#include <ranges>
#include <string_view>
#include <vector>
 
void print_chunks(auto view, std::string_view separator = ", ")
{
    for (auto const subrange : view)
    {
        std::cout << '[';
        for (std::string_view prefix; auto const& elem : subrange)
            std::cout << prefix << elem, prefix = separator;
        std::cout << "] ";
    }
    std::cout << '\n';
}
 
int main()
{
    {
        auto v = std::vector{1, 2, 3, 1, 2, 3, 3, 3, 1, 2, 3};
        auto fun = std::ranges::less{};
        auto view = v | std::views::chunk_by(fun);
        print_chunks(view);
    }
    {
        auto v = std::vector{1, 2, 3, 4, 4, 0, 2, 3, 3, 3, 2, 1};
        auto fun = std::not_fn(std::ranges::equal_to{}); // or ranges::not_equal_to
        auto view = v | std::views::chunk_by(fun);
        print_chunks(view);
    }
    {
        std::string v = "__cpp_lib_ranges_chunk_by";
        auto fun = [](char x, char y) { return not(x == '_' or y == '_'); };
        auto view = v | std::views::chunk_by(fun);
        print_chunks(view, "");
    }
}

Вывод:

[1, 2, 3] [1, 2, 3] [3] [3] [1, 2, 3] 
[1, 2, 3, 4] [4, 0, 2, 3] [3] [3, 2, 1] 
[_] [_] [cpp] [_] [lib] [_] [ranges] [_] [chunk] [_] [by]

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2023):
    • 26.7.30 Chunk by view [range.chunk.by]

См. также

ranges::chunk_viewviews::chunk
(C++23)
диапазон view из N-размерных неперекрывающихся последовательных фрагментов элементов другого view
(шаблон класса) (объект адаптера диапазонов)
ranges::slide_viewviews::slide
(C++23)
view, M-й элемент которого является view над M-м по (M + N - 1)-й элементами другого view
(шаблон класса) (объект адаптера диапазонов)
ranges::stride_viewviews::stride
(C++23)
view, состоящий из элементов другого view, перемещаясь по N элементам за раз
(шаблон класса) (объект адаптера диапазонов)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/chunk_by_view

Spec-Zone.ru

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