Поделиться через


split_view class (стандартная библиотека C++)

Разбивает представление на подранги на основе разделителя. Разделитель может быть одним элементом или представлением элементов. Разделитель не является частью результирующего split_viewэлемента.

Связанное lazy_split_view представление — это класс. Основные различия между split_view ними lazy_split_view :

Представление Может разделить const диапазон Тип диапазона
split_view no Поддерживает forward_range или выше.
lazy_split_view yes Поддерживает input_range или выше.

Предпочитайте split_view , так как это более эффективно, если вы не должны разделить диапазон, который является const.

Синтаксис

template<forward_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
    indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to>
class split_view : public view_interface<split_view<V, Pattern>>;

Параметры шаблона

Pattern
Тип представления, указывающего последовательность разделителей.

V
Тип базового представления.

Просмотр характеристик

Описание следующих записей см. в разделе "Просмотр характеристик класса"

Characteristic Description
Адаптер диапазона views::split
Базовый диапазон То же, что и базовый диапазон
Тип элемента range_reference_t<V>
Просмотр категории итератора Удовлетворяет forward_range
Размер No
Is const-iterable No
Общий диапазон Только если базовый диапазон удовлетворяет common_range
Заимствуемый диапазон No

Участники

Функции-члены Description
Конструкторы Создайте представление.
baseC++20 Получение базового диапазона.
beginC++20 Получите итератор к первому элементу.
endC++20 Получите sentinel в конце представления.
Наследуется от view_interface Description
emptyC++20 Проверьте, является ли представление пустым.
frontC++20 Получите первый элемент.
operator boolC++20 Проверьте, не является ли представление пустым.

Требования

Заголовок: <ranges> (с C++20)

Пространство имен: std::ranges

Параметр компилятора: /std:c++20 или более поздней версии требуется.

Конструкторы

Создание экземпляра объекта split_view

1) split_view() requires default_initializable<V> && default_initializable<Pattern> = default;
2) constexpr split_view(V base, Pattern pattern);
3) template<input_range R> requires constructible_from<V, views::all_t<R>> &&
     constructible_from<Pattern, single_view<range_value_t<R>>>
     constexpr split_view(R&& rg, range_value_t<R> e);

Параметры

e
Один элемент, определяющий место разделения представления. Элемент не является частью результирующего представления.

base
Базовое представление.

pattern
Представление элементов, определяющих место разделения представления. Представление элементов не является частью результирующего представления.

rg
Диапазон для разделения.

Сведения о типах параметров шаблона см. в разделе "Параметры шаблона".

Возвращаемое значение

Экземпляр split_view , содержащий один или несколько подрангов.

Замечания

Лучший способ создания split_view — использовать views::split адаптер диапазона. Адаптеры диапазона — это способ создания классов представления. Типы представлений предоставляются только в том случае, если вы хотите создать собственный тип пользовательского представления.

1) Создайте split_view созданный по умолчанию объект. Базовое представление и pattern построено по умолчанию. base() возвращает копию V().
2) Создание split_view путем разделения представления с помощью последовательности разделителей.
3) Создание split_view , разделив представление с помощью одного разделителя.

Пример: split_view.

// requires /std:c++20 or later
#include <ranges>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> rg{ 1, 2, 3, 1, 2, 3, 4, 5, 6 };

    // pipe syntax using range adaptor
    for (const auto& subrange : rg | std::views::split(3))
    {
        // outputs
        // 1 2
        // 1 2
        // 4 5 6
        for (const auto& elem : subrange)
        {
            std::cout << elem << ' ';
        }
        std::cout << '\n';
    }
    
    int delimiters[] = {2, 3};
    for (auto splitRange : std::views::split(rg, delimiters)) // ctor syntax
    {
        for (auto& i : splitRange)
        {
            std::cout << i << " "; // 1 1 4 5 6
        }
    }
}
1 2
1 2
4 5 6
1 1 4 5 6

base

Получает копию базового представления.

// Uses a copy constructor to return the underlying view
1) constexpr V base() const & requires std::copy_constructible<V>;

// Uses a move constructor to return the underlying view
2) constexpr V base() &&;

Параметры

Нет.

Возвраты

Базовое представление.

begin

Получите итератор к первому элементу в представлении.

constexpr auto begin();

Параметры

Нет.

Возвращаемое значение

Итератор, указывающий на первый элемент в представлении.

Изображение вектора с элементами 10, 20 и 30. Первый элемент содержит 10 и помечен как begin(). Последний элемент содержит 30 и помечен как последний элемент. Мнимый прямоугольник после последнего элемента указывает sentinel и обозначает конец().

end

Получите sentinel в конце представления.

constexpr auto end();

Параметры

Нет.

Возвращаемое значение

Sentinel, следующий за последним элементом в представлении:

Изображение вектора с элементами 10, 20 и 30. Первый элемент содержит 10 и помечен как begin(). Последний элемент содержит 30 и помечен как последний элемент. Мнимый прямоугольник после последнего элемента указывает sentinel и обозначает конец().

См. также

<ranges>
split_view адаптер диапазона
Класс lazy_split_view
Классы представления