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_split
Zá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í. |
base C++20 |
Získejte podkladovou oblast. |
begin C++20 |
Získejte iterátor k prvnímu prvku v zobrazení. |
end C++20 |
Získejte sentinel na konci zobrazení. |
Zděděno z view_interface |
Popis |
empty C++20 |
Otestujte, jestli je zobrazení prázdné. |
front C++20 |
Získejte první prvek. |
operator bool C++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 subrange
s.
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í.
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í:
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