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 |
---|---|
Конструкторы | Создайте представление. |
base C++20 |
Получение базового диапазона. |
begin C++20 |
Получите итератор к первому элементу в представлении. |
end C++20 |
Получите sentinel в конце представления. |
Наследуется от view_interface |
Description |
empty C++20 |
Проверьте, является ли представление пустым. |
front C++20 |
Получите первый элемент. |
operator bool C++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
, содержащий один или несколько subrange
s.
Замечания
Лучший способ создания 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>
Параметры
Нет.
Возвращаемое значение
Итератор, указывающий на первый элемент в представлении.
end
Получите sentinel в конце представления.
1) constexpr auto end() const;
2) constexpr auto end() requires forward_range<V> && common_range<V>;
Параметры
Нет.
Возвращаемое значение
Sentinel, следующий за последним элементом в представлении:
Замечания
2) forward_range<V>
Требование означает, что представление V
имеет по крайней мере итератор пересылки. Дополнительные сведения о итераторах диапазона см. в разделе "Просмотр характеристик класса". Требование common_range<V>
означает, что представление V
имеет идентичные итераторы и типы sentinel.
См. также
<ranges>
lazy_split
Класс адаптераsplit_view
диапазона
Классы представления