lazy_split_view
class (Standardowa biblioteka C++)
Dzieli zakres na podgrupy na podstawie ogranicznika. Ogranicznik może być pojedynczym elementem lub widokiem elementów. Ogranicznik nie jest częścią wynikowych podzestawów.
Podstawowe różnice między elementem a a split_view
lazy_split_view
to:
Widok | Może podzielić const zakres |
typ zakresu |
---|---|---|
split_view |
nie | Obsługuje forward_range lub wyższe. |
lazy_split_view |
tak | Obsługuje input_range lub wyższe. |
Co sprawia, że lazy_split_view
"leniwy" jest to, że nie patrzy na następny ogranicznik. Oznacza to, że może obsługiwać obsługę input_range
, natomiast split_view
wymaga co najmniej forward_range
. Jest to spowodowane tym, że input_range
jest jednoprzepustowa, natomiast forward_range
umożliwia iterację wieloprzepustową.
Preferuj split_view
, ponieważ jest to bardziej wydajne — chyba że musisz podzielić zakres, który ma wartość const
. Jeśli chodzi o wydajność, split_view
jest wydajniejszy.
A lazy_split_view
ma mniej wydajne iteratory przyrostowe i porównanie niż split_view
, ale nadal jest O(1). Wartość split_view
ma lepszą wydajność, gdy odległość między ogranicznikami jest wystarczająco mała, aby podgrupy mieściły się w pamięci podręcznej procesora CPU, w tym przypadku ogranicznik skutecznie pre-caches następnej kolejności.
Składnia
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>>
Parametry szablonu
Pattern
Typ widoku, który określa sekwencję ogranicznika.
Wymaganie (forward_range<V> || tiny-range <Pattern>)
oznacza, że jeśli bazowy zakres nie forward_range
jest , ogranicznik musi być .tiny_range
A tiny_range
to zakres ze statycznym zakresem, którego rozmiar to 0 lub 1. tiny_range<T>
wymaga sized_range<T>
, i T::size()
musi być wyrażeniem stałym, które jest mniejsze lub równe 1.
V
Typ widoku bazowego.
Charakterystyki
Opis poniższych wpisów można znaleźć w temacie View class characteristics (Wyświetlanie właściwości klas)
Adapter zakresu: zakres bazowy: lazy_split
musi spełniać input_range
lub wyższą kategorię iteratora Wyświetl: taką samą jak podstawowy zakres Typ elementu: kolekcja range_reference_t<V>
Rozmiar: brak wspólnego zakresu: Tak, gdy zakres bazowy jest zarówno forward_range
i .common
Zakres pożyczony: nie jest const
iterowalny: tylko wtedy, gdy zakres forward_range
bazowy spełnia i jest const
iterowalny
Elementy członkowskie
Funkcje składowe | Opis |
---|---|
Konstruktory | Skonstruuj widok. |
base C++20 |
Pobierz zakres bazowy. |
begin C++20 |
Pobierz iterator do pierwszego elementu w widoku. |
end C++20 |
Pobierz element sentinel na końcu widoku. |
Dziedziczone z view_interface |
Opis |
empty C++20 |
Sprawdź, czy widok jest pusty. |
front C++20 |
Pobierz pierwszy element. |
operator bool C++20 |
Sprawdź, czy widok nie jest pusty. |
Wymagania
Nagłówek: <ranges>
(od C++20)
Przestrzeń nazw: std::ranges
Opcja kompilatora: /std:c++20
lub nowsza jest wymagana.
Konstruktory
Konstruowanie wystąpienia obiektu 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);
Parametry szablonu
Pattern
Typ ogranicznika.
R
Typ zakresu.
V
Typ widoku bazowego.
Parametry
e
Pojedynczy element określający, gdzie należy podzielić widok. Element nie jest częścią wynikowych podranges.
base
Widok bazowy.
pattern
Widok elementów, które identyfikują, gdzie należy podzielić widok. Widok elementów nie jest częścią wynikowych podzestawów.
rg
Zakres do podzielenia.
Wartość zwracana
Wystąpienie lazy_split_view
, które zawiera co najmniej jeden subrange
s.
Uwagi
Najlepszym sposobem utworzenia elementu lazy_split_view
jest użycie adaptera views::lazy_split
zakresu. Adaptery zakresów są zamierzonym sposobem tworzenia klas widoków. Typy widoków są widoczne tylko w przypadku, gdy chcesz utworzyć własny typ widoku niestandardowego.
1) Utwórz element lazy_split_view
bez elementów. Widok podstawowy jest domyślnie skonstruowany. base()
Zwraca kopię elementu V()
.
2) Utwórz element lazy_split_view
, dzieląc widok przy użyciu sekwencji ograniczników.
3) Utwórz element lazy_split_view
, dzieląc widok przy użyciu elementu ogranicznika.
Przykład: 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
Pobiera kopię widoku bazowego.
// 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() &&;
Parametry
Brak.
Zwraca
Widok bazowy.
begin
Pobierz iterator do pierwszego elementu w widoku.
constexpr auto begin();
constexpr auto begin() const requires forward_range<V> && forward_range<const V>
Parametry
Brak.
Wartość zwracana
Iterator wskazujący pierwszy element w widoku.
end
Pobierz element sentinel na końcu widoku.
1) constexpr auto end() const;
2) constexpr auto end() requires forward_range<V> && common_range<V>;
Parametry
Brak.
Wartość zwracana
Sentinel, który jest zgodny z ostatnim elementem w widoku:
Uwagi
2) Wymaganie forward_range<V>
oznacza, że widok V
ma co najmniej iterator do przodu. Aby uzyskać więcej informacji na temat iteratorów zakresu, zobacz View class characteristics (Wyświetlanie cech klas). Wymaganie common_range<V>
oznacza, że widok V
ma identyczne typy iteracyjne i sentinel.
Zobacz też
<ranges>
lazy_split
range adaptor,split_view
klasa
klasy widoków