Namespaces
Variants

std::ranges::views::lazy_split, std::ranges::lazy_split_view

Aus de.cppreference.net
 
 
Ranges-Bibliothek
Range-Adaptoren
 
 
Definiert in Header <ranges>
template< ranges::input_range V, ranges::forward_range Pattern >
requires ranges::view<V> &&
         ranges::view<Pattern> &&
         std::indirectly_comparable<ranges::iterator_t<V>,
                                    ranges::iterator_t<Pattern>,
                                    ranges::equal_to> &&
         (ranges::forward_range<V> || /*tiny-range*/<Pattern>)
class lazy_split_view
    : public ranges::view_interface<lazy_split_view<V, Pattern>>
(1) (seit C++20)
namespace views {
    inline constexpr /* unspecified */ lazy_split = /* unspecified */;
}
(2) (seit C++20)
Aufrufsignatur
template< ranges::viewable_range R, class Pattern >
    requires /* see below */
constexpr ranges::view auto lazy_split( R&& r, Pattern&& pattern );
(seit C++20)
template< class Pattern >
constexpr /* range adaptor closure */ lazy_split( Pattern&& pattern );
(seit C++20)
Helfer-Konzepte
template< class R >
concept /*tiny-range*/ =
    ranges::sized_range<R> &&
    requires { /* is-statically-constexpr-sized */<R>; } &&
    (std::remove_reference_t<R>::size() <= 1);
(3) (nur zur Darstellung*)
1) lazy_split_view nimmt eine view und ein Trennzeichen und teilt die view am Trennzeichen in Teilbereiche auf.

Zwei Hauptszenarien werden unterstützt:

2) Ein RangeAdaptorObject. Der Ausdruck views::lazy_split(e, f) ist ausdrucksäquivalent zu lazy_split_view(e, f).
3) Das nur zur Darstellung dienende Konzept /*tiny-range*/<Pattern> ist erfüllt, wenn Pattern sized_range erfüllt, Pattern::size() ein konstanter Ausdruck ist und als Vorlagen-Nichttypargument geeignet ist und der Wert von Pattern::size() kleiner oder gleich 1 ist. Insbesondere erfüllen empty_view und single_view dieses Konzept.

lazy_split_view modelliert die Konzepte forward_range und input_range, wenn die zugrundeliegende view V die entsprechenden Konzepte modelliert, und modelliert common_range, wenn V sowohl forward_range als auch common_range modelliert.

Der innere Bereich (ranges::range_reference_t<lazy_split_view>) modelliert die Konzepte forward_range und input_range, wenn die zugrundeliegende view V die entsprechenden Konzepte modelliert. Er modelliert kein common_range und kann nicht mit Algorithmen verwendet werden, die ein bidirectional_range oder höher erwarten.

Anders als split_view bewahrt lazy_split_view nicht die Kontinuität des Teilbereichs.

Datenmitglieder

Member Beschreibung
V base_ (private) die zugrundeliegende view
( Nur zur Veranschaulichung verwendetes Member-Objekt* )
Pattern pattern_ (private) das Muster, das als Trennzeichen zum Aufteilen der zugrundeliegenden view verwendet wird
( Nur zur Veranschaulichung verwendetes Member-Objekt* )
non-propagating-cache < ranges:: iterator_t < V >> current_ (private)
(nur vorhanden, wenn V nicht forward_range erfüllt)
ein Objekt, das das Ergebnis von Aufrufen an begin() zwischenspeichert
( Nur zur Veranschaulichung verwendetes Member-Objekt* )

Memberfunktionen

konstruiert einen lazy_split_view
(öffentliche Elementfunktion)
gibt eine Kopie der zugrundeliegenden (adaptierten) Ansicht zurück
(öffentliche Elementfunktion)
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion)
gibt einen Iterator oder Sentinel zum Ende zurück
(öffentliche Elementfunktion)
Geerbt von ranges::view_interface
gibt zurück, ob die abgeleitete Ansicht leer ist, nur verfügbar, wenn sie sized_range oder forward_range
erfülltstd::ranges::view_interface<D>(öffentliche Elementfunktion von
cbegin
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück std::ranges::view_interface<D>(öffentliche Elementfunktion von
cend
(C++23)
gibt einen Sentinel für den konstanten Iterator des Bereichs zurück std::ranges::view_interface<D>(öffentliche Elementfunktion von
operator boolgibt zurück, ob die abgeleitete Ansicht nicht leer ist, nur verfügbar, wenn ranges::empty
darauf anwendbar ist std::ranges::view_interface<D>(öffentliche Elementfunktion von
frontgibt das erste Element in der abgeleiteten Ansicht zurück, verfügbar, wenn sie
forward_rangestd::ranges::view_interface<D> erfüllt

Geschachtelte Klassen

der Iteratortyp
( Nur zur Darstellung verwendete Member-Klassentemplate* )
der Iteratortyp des inneren Bereichs
( Nur zur Darstellung verwendete Member-Klassentemplate* )

Ableitungsleitfäden

Hinweise

Der Name lazy_split_view wurde durch den nach C++20 veröffentlichten Fehlerbericht P2210R2 eingeführt. Es besitzt den gleichen verzögerten Mechanismus wie der alte split_view vor der Änderung.

Beispiel

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
auto print = [](auto const& view)
{
    // `view` ist vom Typ std::views::lazy_split_view::__outer_iterator::value_type
    for (std::cout << "{ "; const auto element : view)
        std::cout << element << ' ';
    std::cout << "} ";
};
int main()
{
    constexpr static auto source = {0, 1, 0, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9};
    constexpr int delimiter{0};
    constexpr std::ranges::lazy_split_view outer_view{source, delimiter};
    std::cout << "splits[" << std::ranges::distance(outer_view) << "]:  ";
    for (auto const& inner_view: outer_view)
        print(inner_view);
    constexpr std::string_view hello{"Hello C++ 20 !"};
    std::cout << "\n" "substrings: ";
    std::ranges::for_each(hello | std::views::lazy_split(' '), print);
    constexpr std::string_view text{"Hello-+-C++-+-20-+-!"};
    constexpr std::string_view delim{"-+-"};
    std::cout << "\n" "substrings: ";
    std::ranges::for_each(text | std::views::lazy_split(delim), print);
}

Ausgabe:

splits[5]:  { } { 1 } { 2 3 } { 4 5 6 } { 7 8 9 }
substrings: { H e l l o } { C + + } { 2 0 } { ! }
substrings: { H e l l o } { C + + } { 2 0 } { ! }

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
P2210R2 C++20 die alte split_view war zu träge für eine einfache Verwendung verlagert ihre Funktionalität zu lazy_split_view

Siehe auch

eine view über die Teilbereiche, die durch Aufteilung einer anderen view mittels eines Trennzeichens erhalten werden
(Klassentemplate) (Range-Adapter-Objekt)
eine view bestehend aus der Sequenz, die durch Glätten einer view von range s erhalten wird
(Klassentemplate) (Range-Adapter-Objekt)