Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <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 /* неопределено */ chunk_by = /* неопределено */ ;

}
(2) (начиная с C++23)
Сигнатура вызова
template < ranges:: viewable_range R, class Pred >

requires /* см. ниже */

constexpr ranges:: view auto chunk_by ( R && r, Pred && pred ) ;
(начиная с C++23)
template < class Pred >
constexpr /*адаптер диапазона-замыкания*/ 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 .

Содержание

Члены данных

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

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

конструирует chunk_by_view
(публичная функция-член)
возвращает копию базового (адаптированного) представления
(публичная функция-член)
возвращает ссылку на сохранённый предикат
(публичная функция-член)
возвращает итератор на начало
(публичная функция-член)
возвращает итератор или страж на конец
(публичная функция-член)
возвращает итератор на начало следующего поддиапазона
( демонстрационная функция-член* )
возвращает итератор на начало предыдущего поддиапазона
( демонстрационная функция-член* )
Наследуется от 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> )

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

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

тип итератора
( демонстрационный класс-шаблон* )

Примечания

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

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_ranges_chunk_by 202202L (C++23) std::ranges::chunk_by_view

Пример

#include <functional>
#include <iostream>
#include <ranges>
#include <string_view>
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()
{
    std::initializer_list v1 = {1, 2, 3, 1, 2, 3, 3, 3, 1, 2, 3};
    auto fn1 = std::ranges::less{};
    auto view1 = v1 | std::views::chunk_by(fn1);
    print_chunks(view1);
    std::initializer_list v2 = {1, 2, 3, 4, 4, 0, 2, 3, 3, 3, 2, 1};
    auto fn2 = std::ranges::not_equal_to{};
    auto view2 = v2 | std::views::chunk_by(fn2);
    print_chunks(view2);
    std::string_view v3 = "__cpp_lib_ranges_chunk_by";
    auto fn3 = [](auto x, auto y) { return not(x == '_' or y == '_'); };
    auto view3 = v3 | std::views::chunk_by(fn3);
    print_chunks(view3, "");
    std::string_view v4 = "\u007a\u00df\u6c34\u{1f34c}"; // "zß水🍌"
    auto fn4 = [](auto, auto ß) { return 128 == ((128 + 64) & ß); };
    auto view4 = v4 | std::views::chunk_by(fn4);
    print_chunks(view4, "");
}

Вывод:

[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]
[z] [ß] [水] [🍌]

Ссылки

  • Стандарт C++23 (ISO/IEC 14882:2024):
  • 26.7.30 Представление группировки по [range.chunk.by]

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

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