Sdílet prostřednictvím


lazy_split_view class (standardní knihovna jazyka C++)

Rozdělí rozsah na podrangely na základě oddělovače. Oddělovač může být jeden prvek nebo zobrazení prvků. Oddělovač není součástí výsledných podrangů.

Hlavní rozdíly mezi a a split_view lazy_split_view :

Zobrazení Může rozdělit oblast.const typ rozsahu
split_view ne Podporuje forward_range nebo vyšší.
lazy_split_view ano Podporuje input_range nebo vyšší.

Čím je lazy_split_view "opožděný", znamená to, že se nedívá na další oddělovač. To znamená, že může podporovat input_range , zatímco split_view vyžaduje alespoň forward_range. Je to proto, že input_range je to jedno pass, zatímco forward_range umožňuje iteraci s více průchody.

Preferujte split_view , protože je efektivnější – pokud není nutné rozdělit rozsah, který je const. Pokud jde o výkon, split_view je efektivnější.

A lazy_split_view má méně efektivní iterátor inkrementace a porovnání než split_view, ale je stále O(1). Má split_view lepší výkon, když je vzdálenost mezi oddělovači dostatečně malá, aby se do mezipaměti procesoru vešla do mezipaměti procesoru, což v takovém případě efektivně předpamětí další dílčí uspořádání předpamětí.

Syntaxe

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 šablony

Pattern
Typ zobrazení, který určuje sekvenci oddělovače.
Požadavek (forward_range<V> || tiny-range <Pattern>) znamená, že pokud základní oblast není forward_range, oddělovač musí být .tiny_range A tiny_range je rozsah se statickým rozsahem, jehož velikost je 0 nebo 1. tiny_range<T> vyžaduje sized_range<T>, a T::size() musí být konstantní výraz, který je menší nebo roven 1.

V
Typ podkladového zobrazení.

Charakteristiky

Popis následujících položek naleznete v tématu Zobrazení vlastností třídy.

Adaptátor rozsahu: lazy_splitZákladní rozsah: musí splňovat input_range nebo vyšší kategorii iterátoru Zobrazení: stejné jako typ základního rozsahu: kolekcerange_reference_t<V> Velikost: bez společné oblasti: Ano, pokud je podkladová oblast obě forward_range a .common Zapůjčený rozsah: není const-iterable: pouze pokud základní rozsah splňuje forward_range a je const-iterable

Členové

Členské funkce Popis
Konstruktory Vytvořte zobrazení.
baseC++20 Získejte podkladovou oblast.
beginC++20 Získejte iterátor k prvnímu prvku v zobrazení.
endC++20 Získejte sentinel na konci zobrazení.
Zděděno z view_interface Popis
emptyC++20 Otestujte, jestli je zobrazení prázdné.
frontC++20 Získejte první prvek.
operator boolC++20 Otestujte, jestli zobrazení není prázdné.

Požadavky

Hlavička: <ranges> (od C++20)

Obor názvů: std::ranges

Je vyžadována možnost kompilátoru: /std:c++20 nebo novější.

Konstruktory

Vytvoření instance objektu 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 šablony

Pattern
Typ oddělovače.

R
Typ rozsahu.

V
Typ podkladového zobrazení.

Parametry

e Jeden prvek, který identifikuje, kde se má zobrazení rozdělit. Prvek není součástí výsledných dílčích uspořádání.

base
Podkladové zobrazení.

pattern
Zobrazení prvků, které identifikují, kde se má zobrazení rozdělit. Zobrazení prvků není součástí výsledných dílčích uspořádání.

rg
Oblast, která se má rozdělit.

Vrácená hodnota

Instance lazy_split_view , která obsahuje jednu nebo více subranges.

Poznámky

Nejlepší způsob, jak vytvořit, lazy_split_view je použití adaptéru rozsahu views::lazy_split . Adaptéry rozsahu představují zamýšlený způsob vytváření tříd zobrazení. Typy zobrazení se zobrazí jenom v případě, že chcete vytvořit vlastní typ zobrazení.

1) Vytvořte prvek lazy_split_view , který neobsahuje žádné prvky. Výchozí zobrazení je vytvořené. base()vrátí kopii .V()
2) Vytvořte lazy_split_view zobrazení rozdělením zobrazení pomocí sekvence oddělovače.
3) Vytvořte zobrazení lazy_split_view rozdělením zobrazení pomocí elementu oddělovače.

Příklad: 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

Získá kopii podkladového zobrazení.

// 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

Žádná

Návraty

Podkladové zobrazení.

begin

Získejte iterátor k prvnímu prvku v zobrazení.

constexpr auto begin();
constexpr auto begin() const requires forward_range<V> && forward_range<const V>

Parametry

Žádná

Vrácená hodnota

Iterátor ukazující na první prvek v zobrazení.

Obrázek vektoru s prvky 10, 20 a 30 První prvek obsahuje hodnotu 10 a je označen jako begin(). Poslední prvek obsahuje hodnotu 30 a je označený jako

end

Získejte sentinel na konci zobrazení.

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

Parametry

Žádná

Vrácená hodnota

Sentinel, který následuje za posledním prvkem v zobrazení:

Obrázek vektoru s prvky 10, 20 a 30 První prvek obsahuje hodnotu 10 a je označen jako begin(). Poslední prvek obsahuje hodnotu 30 a je označený jako

Poznámky

2) Požadavek forward_range<V> znamená, že zobrazení V má alespoň předaný iterátor. Další informace o iterátorech rozsahu naleznete v tématu Zobrazení vlastností třídy. Požadavek common_range<V> znamená, že zobrazení V má identické typy iterátoru a sentinelu.

Viz také

<ranges>
lazy_split range adaptorsplit_view – třída
zobrazit třídy