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) RangeAdaptorObject. Выражение 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 моделирует соответствующие концепции.

Члены данных

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

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

(конструктор)
(C++20)
Конструирует split_view
(публичная функция-член)
base
(C++20)
Возвращает копию базового (адаптированного) представления
(публичная функция-член)
begin
(C++20)
Возвращает итератор начала
(публичная функция-член)
end
(C++20)
Возвращает итератор или разделитель конца
(публичная функция-член)
find_next
(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>)

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

iterator
(C++20)
Тип итератора
(вложенный класс только для демонстрации*)
sentinel
(C++20)
Тип разделителя
(вложенный класс только для демонстрации*)

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

Примечания

До P2210R2, split_view использовал ленивый механизм разделения, и поэтому не мог сохранить двунаправленные, произвольные или непрерывные свойства базового представления, или сделать тип итератора внутреннего диапазона таким же, как у базового представления. Соответственно, он был переработан в P2210R2, а ленивый механизм перемещен в lazy_split_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)
адаптер диапазона, работающий над поддиапазонами, полученными путем разделения другого диапазона с помощью разделителя
(шаблон класса) (объект адаптера диапазона)
ranges::join_viewviews::join
(C++20)
адаптер диапазона, представляющий последовательность, полученную путем сглаживания диапазона диапазонов
(шаблон класса) (объект адаптера диапазона)

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

Spec-Zone.ru

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