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) 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, когда базовый 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 или более высокий уровень.

Члены данных

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

Члены-функции

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

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

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

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

Примечания

Имя 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 range
(шаблон класса) (объект адаптера диапазона)

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

Spec-Zone.ru

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