Namespaces
Variants

std::ranges::views::lazy_split, std::ranges::lazy_split_view

Начало с ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
 
Определён в заголовке <ranges>
template< ranges::input_range V, ranges::forward_range Pattern >
requires ranges::view<V> &&
         ranges::view<Pattern> &&
         std::indirectly_comparable<ranges::iterator_t<V>,
                                    ranges::iterator_t<Pattern>,
                                    ranges::equal_to> &&
         (ranges::forward_range<V> || /*tiny-range*/<Pattern>)
class lazy_split_view
    : public ranges::view_interface<lazy_split_view<V, Pattern>>
(1) (начиная с C++20)
namespace views {
    inline constexpr /* unspecified */ lazy_split = /* unspecified */;
}
(2) (начиная с C++20)
Сигнатура вызова
template< ranges::viewable_range R, class Pattern >
    requires /* see below */
constexpr ranges::view auto lazy_split( R&& r, Pattern&& pattern );
(начиная с C++20)
template< class Pattern >
constexpr /* range adaptor closure */ lazy_split( Pattern&& pattern );
(начиная с C++20)
Вспомогательные концепты
template< class R >
concept /*tiny-range*/ =
    ranges::sized_range<R> &&
    requires { /* is-statically-constexpr-sized */<R>; } &&
    (std::remove_reference_t<R>::size() <= 1);
(3) (только для пояснения*)
1) lazy_split_view принимает представление и разделитель и разделяет представление на поддиапазоны по разделителю.

Поддерживаются два основных сценария:

2) Объект RangeAdaptorObject. Выражение views::lazy_split(e, f) является эквивалентным выражению lazy_split_view(e, f).
3) Концепт, существующий только для пояснения, /*tiny-range*/<Pattern> выполняется, если Pattern удовлетворяет sized_range, Pattern::size() является константным выражением и подходит в качестве аргумента шаблона, не являющегося типом, а значение Pattern::size() меньше или равно 1. Примечательно, что empty_view и single_view удовлетворяют этому концепту.

lazy_split_view моделирует концепты forward_range и input_range, когда базовое представление V моделирует соответствующие концепты, и моделирует common_range, когда V моделирует как forward_range, так и common_range.

Внутренний диапазон (ranges::range_reference_t<lazy_split_view>) моделирует концепты forward_range и input_range, когда базовое представление V моделирует соответствующие концепты. Он не моделирует common_range и не может использоваться с алгоритмами, которые ожидают bidirectional_range или выше.

В отличие от split_view, lazy_split_view не сохраняет непрерывность поддиапазона.

Члены данных

Член Описание
V base_ (private) базовое view
( объект-член только для демонстрации* )
Pattern pattern_ (private) шаблон, используемый в качестве разделителя для разбиения базового view
( объект-член только для демонстрации* )
non-propagating-cache < ranges:: iterator_t < V >> current_ (private)
(присутствует только если V не удовлетворяет forward_range )
объект, кэширующий результат вызовов begin()
( объект-член только для демонстрации* )

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

создаёт lazy_split_view
(public member function)
возвращает копию базового (адаптированного) представления
(public member function)
возвращает итератор на начало
(public member function)
возвращает итератор или страж на конец
(public member function)
Унаследовано от 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>)

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

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

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

Примечания

Название lazy_split_view введено пост-C++20 отчетом об ошибках P2210R2 . Оно имеет такую же ленивую механику, как и у старого split_view до изменений.

Пример

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
auto print = [](auto const& view)
{
    // `view` имеет тип std::views::lazy_split_view::__outer_iterator::value_type
    for (std::cout << "{ "; const auto element : view)
        std::cout << element << ' ';
    std::cout << "} ";
};
int main()
{
    constexpr static auto source = {0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9};
    constexpr int delimiter{0};
    constexpr std::ranges::lazy_split_view outer_view{source, delimiter};
    std::cout << "splits[" << std::ranges::distance(outer_view) << "]:  ";
    for (auto const& inner_view: outer_view)
        print(inner_view);
    constexpr std::string_view hello{"Hello C++ 20 !"};
    std::cout << "\n" "substrings: ";
    std::ranges::for_each(hello | std::views::lazy_split(' '), print);
    constexpr std::string_view text{"Hello-+-C++-+-20-+-!"};
    constexpr std::string_view delim{"-+-"};
    std::cout << "\n" "substrings: ";
    std::ranges::for_each(text | std::views::lazy_split(delim), print);
}

Вывод:

splits[5]:  { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
substrings: { H e l l o } { C + + } { 2 0 } { ! }

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
P2210R2 C++20 старый split_view был слишком ленивым для удобного использования перемещает свою функциональность в lazy_split_view

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

представление view над поддиапазонами, полученными при разделении другого view с использованием разделителя
(шаблон класса) (объект адаптера диапазона)
представление view состоящее из последовательности, полученной при выравнивании view из range s
(шаблон класса) (объект адаптера диапазона)