Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
 
Definiert in der Header-Datei <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)
Aufruf-Signatur
template< ranges::viewable_range R, class Pattern >

    requires /* siehe unten */

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)
Hilfskonzepte
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 Exposition*)
1) lazy_split_view nimmt eine view und ein Trennzeichen und teilt die view auf dem 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 exposition-only Konzept /*tiny-range*/<Pattern> ist erfüllt, wenn Pattern sized_range erfüllt, Pattern::size() eine konstante Ausdrückung und als Template-Nichttyp-Argument 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 zugrunde liegende view V die jeweiligen 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 zugrunde liegende view V die jeweiligen Konzepte modelliert. Sie modelliert nicht common_range und kann nicht mit Algorithmen verwendet werden, die eine bidirectional_range oder höher erwarten.

Im Gegensatz zu split_view behält lazy_split_view nicht die Kontinuität des Teilbereichs bei.

Inhalt

[bearbeiten] Datenmember

Mitglied Beschreibung
V base_ (private) die zugrunde liegende view
((exposition-only member object*)
Pattern pattern_ (private) das Muster, das als Trennzeichen zum Aufteilen der zugrunde liegenden view verwendet wird
((exposition-only member object*)
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 von begin() cacht
((exposition-only member object*)

[bearbeiten] Memberfunktionen

konstruiert eine lazy_split_view
(öffentliche Member-Funktion) [edit]
gibt eine Kopie der zugrunde liegenden (angepassten) View zurück
(public member function) [edit]
gibt einen Iterator zum Anfang zurück
(öffentliche Member-Funktion) [edit]
gibt einen Iterator oder Sentinel zum Ende zurück
(öffentliche Member-Funktion) [edit]
Geerbt von std::ranges::view_interface
gibt zurück, ob die abgeleitete Ansicht leer ist, bereitgestellt nur, wenn sie sized_range oder forward_range erfüllt
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt einen konstanten Iterator zum Anfang des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
(C++23)
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück
(public member function of std::ranges::view_interface<D>) [edit]
gibt zurück, ob die abgeleitete Ansicht nicht leer ist, bereitgestellt nur, wenn ranges::empty darauf anwendbar ist
(public member function of std::ranges::view_interface<D>) [edit]
gibt das erste Element in der abgeleiteten View zurück, bereitgestellt, wenn sie forward_range erfüllt
(öffentliche Member-Funktion von std::ranges::view_interface<D>) [edit]

[bearbeiten] Verschachtelte Klassen

der Iterator-Typ
((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*)
der Iteratortyp des inneren Bereichs
((nur zur Veranschaulichung Exposition-only Member-Klassenschablone)*)

[bearbeiten] Deduktionshilfen

[bearbeiten] Anmerkungen

Der Name lazy_split_view wurde durch den Post-C++20-Defect-Report P2210R2 eingeführt. Er hat den gleichen Lazy-Mechanismus wie die alte split_view vor der Änderung.

[bearbeiten] Beispiel

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string_view>
 
auto print = [](auto const& view)
{
    // `view` is of 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 } { ! }

[bearbeiten] Defect Reports

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

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
P2210R2 C++20 die alte split_view war zu faul, um leicht verwendet werden zu können verschiebt ihre Funktionalität auf lazy_split_view

[bearbeiten] Siehe auch

ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden
(Klassen-Template) (Range-Adaptor-Objekt)[edit]
ein view, der aus der Sequenz besteht, die durch Abflachung eines view von ranges gebildet wird
(Klassen-Template) (Range-Adaptor-Objekt)[edit]