Namespaces
Variants

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

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <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) (since C++20)
namespace views {

inline constexpr /* unspecified */ lazy_split = /* unspecified */ ;

}
(2) (since C++20)
Сигнатура вызова
template < ranges:: viewable_range R, class Pattern >

requires /* see below */

constexpr ranges:: view auto lazy_split ( R && r, Pattern && pattern ) ;
(since C++20)
template < class Pattern >
constexpr /* range adaptor closure */ lazy_split ( Pattern && pattern ) ;
(since 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 на поддиапазоны по разделителю.

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

  • Если view является input_range , разделитель представляет собой отдельный элемент (обёрнутый в single_view ).
  • Если 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 или выше.

В отличие от 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)
Наследуется от std::ranges::view_interface
возвращает, является ли производное представление пустым, предоставляется только если оно удовлетворяет sized_range или forward_range
(public member function of std::ranges::view_interface<D> )
(C++23)
возвращает константный итератор на начало диапазона
(public member function of std::ranges::view_interface<D> )
(C++23)
возвращает страж для константного итератора диапазона
(public member function of std::ranges::view_interface<D> )
возвращает, является ли производное представление непустым, предоставляется только если ranges::empty применимо к нему
(public member function of std::ranges::view_interface<D> )
возвращает первый элемент в производном представлении, предоставляется если оно удовлетворяет forward_range
(public member function of 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
(шаблон класса) (объект адаптера диапазона)