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


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

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

Основными различиями между a split_view и a lazy_split_view являются:

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

То, что делает lazy_split_view "ленивым" заключается в том, что он не ищет голову для следующего разделителя. Это означает, что она может поддерживать input_range , в то время как split_view требуется по крайней мере forward_range. Это связано с тем, что input_range однопроходная итерация позволяет выполнять итерацию с несколькими передачами forward_range .

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

У lazy_split_view итератора меньше итератора, чем split_view, но по-прежнему O(1). Более высокую split_view производительность, если расстояние между разделителями достаточно мало, чтобы подранги соответствовали кэшу ЦП, в этом случае разделитель lookahead эффективно кэширует следующий подранг.

Синтаксис

template<input_range V, forward_range Pattern>
    requires view<V> && view<Pattern> &&
    indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> &&
    (forward_range<V> || tiny_range<Pattern>)
class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>>

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

Pattern
Тип представления, указывающего последовательность разделителей.
Требование (forward_range<V> || tiny-range <Pattern>) означает, что, если базовый диапазон не forward_rangeявляется, разделитель должен быть.tiny_range Диапазон tiny_range со статическим экстентом, размер которого равен 0 или 1. tiny_range<T> требуется sized_range<T>и T::size() должен быть константным выражением, которое меньше или равно 1.

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

Характеристики

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

Адаптер диапазона: базовый диапазон: lazy_splitдолжен соответствовать input_range или более поздней категории итератора представления: то же, что и базовый тип элемента диапазона: коллекцияrange_reference_t<V> размеров: нет общего диапазона: да, если базовый диапазон является обоим forward_range и.common Заимствованный диапазон: нет const-iterable: только если базовый диапазон удовлетворяет forward_range и является constитерируемым.

Участники

Функции-члены 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 или более поздней версии требуется.

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

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

1) lazy_split_view() = default;
2) constexpr lazy_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 lazy_split_view(R&& rg, range_value_t<R> e);

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

Pattern
Тип разделителя.

R
Тип диапазона.

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

Параметры

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

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

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

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

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

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

Замечания

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

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

Пример: lazy_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
    {
        // outputs 1 1 4 5 6
        for (auto& i : splitRange)
        {
            std::cout << i << " ";
        }
    }
}
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();
constexpr auto begin() const requires forward_range<V> && forward_range<const V>

Параметры

Нет.

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

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

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

end

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

1) constexpr auto end() const;
2) constexpr auto end() requires forward_range<V> && common_range<V>;

Параметры

Нет.

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

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

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

Замечания

2) forward_range<V> Требование означает, что представление V имеет по крайней мере итератор пересылки. Дополнительные сведения о итераторах диапазона см. в разделе "Просмотр характеристик класса". Требование common_range<V> означает, что представление V имеет идентичные итераторы и типы sentinel.

См. также

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