Spec-Zone.ru › C++

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

Определён в заголовочном файле <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 принимает view и разделитель и разбивает view на поддиапазоны по разделителю.

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

  • Представление является input_range, а разделитель — отдельный элемент (обёрнутый в single_view).
  • Представление является forward_range, а разделитель — view элементов.
2) Объект-адаптер диапазона. Выражение 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, если лежащее в основе view V моделирует соответствующие концепты, и моделирует common_range, если V моделирует одновременно forward_range и common_range.

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

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

Члены-данные

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

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

(конструктор)
создаёт lazy_split_view
(открытая функция-член)
base
возвращает копию лежащего в основе (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или сентинел на конец
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает признак того, что производное представление пусто; доступна, только если оно удовлетворяет 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
возвращает признак того, что производное представление не пусто; доступна, только если к нему применим ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет forward_range
(открытая функция-член std::ranges::view_interface<D>)

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

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

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

Примечания

Имя lazy_split_view введено отчётом об ошибке, опубликованным после C++20, P2210R2. Оно использует тот же ленивый механизм, что и старый split_view до изменения.

Пример

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>

auto print = [](auto const& view)
{
    // `view` is of 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 Применено к Опубликованное поведение Правильное поведение
P2210R2 C++20 старый split_view был слишком ленивым для удобного использования переносит его функциональность в lazy_split_view

См. также

ranges::split_viewviews::split
(C++20)
view над поддиапазонами, полученными при разбиении другого view с помощью разделителя
(шаблон класса) (объект-адаптер диапазона)
ranges::join_viewviews::join
(C++20)
view, состоящее из последовательности, полученной путём объединения view из ranges
(шаблон класса) (объект-адаптер диапазона)

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

Spec-Zone.ru

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