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
>
|
(1) | (начиная с C++23) |
|
namespace
views
{
inline
constexpr
/* неопределено */
chunk_by
=
/* неопределено */
;
|
(2) | (начиная с C++23) |
|
Сигнатура вызова
|
||
|
template
<
ranges::
viewable_range
R,
class
Pred
>
requires
/* см. ниже */
|
(начиная с C++23) | |
|
template
<
class
Pred
>
constexpr /*адаптер диапазона-замыкания*/ chunk_by ( Pred && pred ) ; |
(начиная с C++23) | |
chunk_by_view
— это адаптер диапазона, который принимает
view
и вызываемый объект
pred
(бинарный предикат), и создает
view
поддиапазонов (чанков), разделяя базовый диапазон между каждой парой смежных элементов, для которых
pred
возвращает
false
. Первый элемент каждой такой пары принадлежит предыдущему чанку, а второй элемент принадлежит следующему чанку.
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]
Смотрите также
|
(C++23)
|
диапазон
view
s
, состоящий из неперекрывающихся последовательных фрагментов размером
N
элементов другого
view
(шаблон класса) (объект адаптера диапазона) |
|
(C++23)
|
view
, M-й элемент которого является
view
над M-м по (M + N - 1)-й элементы другого
view
(шаблон класса) (объект адаптера диапазона) |
view
, состоящий из элементов другого
view
, перемещающийся на N элементов за раз
(шаблон класса) (объект адаптера диапазона) |