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 обозначает объект-адаптер диапазона. Для подвыражения 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 (открытая функция-член) |
|
| возвращает копию базового (адаптированного) представления (открытая функция-член) |
|
| возвращает ссылку на сохранённый предикат (открытая функция-член) |
|
| возвращает итератор начала (открытая функция-член) |
|
| возвращает итератор или sentinel конца (открытая функция-член) |
|
| возвращает итератор начала следующего поддиапазона (экспозиционная функция-член*) |
|
| возвращает итератор начала предыдущего поддиапазона (экспозиционная функция-член*) |
|
Унаследовано от |
|
возвращает значение, указывающее, является ли производное представление пустым; доступна, только если оно удовлетворяет sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор начала диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает sentinel для константного итератора диапазона (открытая функция-член 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 амортизированную сложность O(1), результат 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 Chunk by view [range.chunk.by]
См. также
|
(C++23) | диапазон из views, представляющих собой неперекрывающиеся последовательные блоки фиксированного размера N из элементов другого view(шаблон класса) (объект-адаптер диапазона) |
|
(C++23) | view, M-й элемент которого является view над элементами с M-го по (M + N - 1)-й другого view(шаблон класса) (объект-адаптер диапазона) |
|
(C++23) | view, состоящее из элементов другого view, с переходом через N элементов за раз(шаблон класса) (объект-адаптер диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/chunk_by_view