Spec-Zone.ru › C++

std::ranges::views::split, std::ranges::split_view

Определён в заголовочном файле <ranges>
template< ranges::forward_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>
class split_view
    : public ranges::view_interface<split_view<V, Pattern>>
(1) (начиная с C++20)
namespace views {
    inline constexpr /* unspecified */ split = /* unspecified */;
}
(2) (начиная с C++20)
Сигнатура вызова
template< ranges::viewable_range R, class Pattern >
    requires /* see below */
constexpr ranges::view auto split( R&& r, Pattern&& pattern );
(начиная с C++20)
template< class Pattern >
constexpr /* range adaptor closure */ split( Pattern&& pattern );
(начиная с C++20)
1) split_view принимает view и разделитель и разбивает view на поддиапазоны по разделителю.
2) Объект-адаптер диапазона. Выражение views::split(e, p) эквивалентно по выражению split_view(e, p) для любых подходящих подвыражений e и p.

split_view удовлетворяет концепциям forward_range и common_range, если лежащий в основе view V удовлетворяет соответствующим концепциям.

Внутренний диапазон (ranges::range_reference_t<split_view>) — это ranges::subrange<ranges::iterator_t<V>>, который удовлетворяет концепции common_range, концепции sized_range, если ranges::iterator_t<V> удовлетворяет std::sized_sentinel_for<ranges::iterator_t<V>>, и концепциям contiguous_range, random_access_range, bidirectional_range и forward_range, если V удовлетворяет соответствующим концепциям.

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

Поля данных

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

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

(конструктор)
создаёт split_view
(открытая функция-член)
base
возвращает копию лежащего в основе (адаптированного) представления
(открытая функция-член)
begin
возвращает итератор на начало
(открытая функция-член)
end
возвращает итератор или сентинел на конец
(открытая функция-член)
find_next
выполняет поиск следующего вхождения шаблона
(функция-член, используемая только для описания*)
Унаследовано от 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>)

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

iterator
тип итератора
(класс-член, используемый только для описания*)
sentinel
тип сентинела
(класс-член, используемый только для описания*)

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

Примечания

До выхода P2210R2 в split_view для разбиения использовался ленивый механизм, поэтому не удавалось сохранить свойства двунаправленного, произвольного доступа или непрерывного диапазона, присущие лежащему в основе представлению, а также обеспечить совпадение типа итератора внутреннего диапазона с типом итератора лежащего в основе представления. В результате в P2210R2 он был переработан, а ленивый механизм перенесён в lazy_split_view.

В качестве разделителя pattern обычно не следует использовать обычный строковый литерал, поскольку завершающий нулевой символ будет считаться обязательной частью разделителя; поэтому вместо него рекомендуется использовать литерал std::string_view.

Пример

#include <iomanip>
#include <iostream>
#include <ranges>
#include <string_view>

int main()
{
    using std::operator""sv;
    constexpr auto words{"Hello^_^C++^_^20^_^!"sv};
    constexpr auto delim{"^_^"sv};

    for (const auto word : std::views::split(words, delim))
        // with string_view's C++23 range constructor:
        std::cout << std::quoted(std::string_view(word)) << ' ';
    std::cout << '\n';
}

Вывод:

"Hello" "C++" "20" "!"

Отчёты об ошибках

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

DR Применяется к Опубликованное поведение Корректное поведение
P2210R2 C++20 старая версия split_view была слишком ленивой для удобного использования она переработана

См. также

ranges::lazy_split_viewviews::lazy_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/cpp/ranges/split_view

Spec-Zone.ru

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