Udostępnij za pośrednictwem


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_rangejest , 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_splitmusi 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 constiterowalny: tylko wtedy, gdy zakres forward_range bazowy spełnia i jest constiterowalny

Elementy członkowskie

Funkcje składowe Opis
Konstruktory Skonstruuj widok.
baseC++20 Pobierz zakres bazowy.
beginC++20 Pobierz iterator do pierwszego elementu w widoku.
endC++20 Pobierz element sentinel na końcu widoku.
Dziedziczone z view_interface Opis
emptyC++20 Sprawdź, czy widok jest pusty.
frontC++20 Pobierz pierwszy element.
operator boolC++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 subranges.

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.

Obraz wektora z elementami 10, 20 i 30. Pierwszy element zawiera wartość 10 i ma etykietę begin(). Ostatni element zawiera wartość 30 i ma etykietę

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:

Obraz wektora z elementami 10, 20 i 30. Pierwszy element zawiera wartość 10 i ma etykietę begin(). Ostatni element zawiera wartość 30 i ma etykietę

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