std::ranges::views::lazy_split, std::ranges::lazy_split_view
| Definiert in der Header-Datei <ranges> |
||
| template< ranges::input_range V, ranges::forward_range Pattern > requires ranges::view<V> && |
(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 */ |
(seit C++20) | |
| template< class Pattern > constexpr /* range adaptor closure */ lazy_split( Pattern&& pattern ); |
(seit C++20) | |
| Hilfskonzepte |
||
| template< class R > concept /*tiny-range*/ = |
(3) | (nur Exposition*) |
lazy_split_view nimmt eine view und ein Trennzeichen und teilt die view auf dem Trennzeichen in Teilbereiche auf.Zwei Hauptszenarien werden unterstützt
- Die View ist ein
input_range, das Trennzeichen ist ein einzelnes Element (eingehüllt in einesingle_view). - Die View ist ein
forward_range, das Trennzeichen ist eineviewvon Elementen.
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) | |
| gibt eine Kopie der zugrunde liegenden (angepassten) View zurück (public member function) | |
| gibt einen Iterator zum Anfang zurück (öffentliche Member-Funktion) | |
| gibt einen Iterator oder Sentinel zum Ende zurück (öffentliche Member-Funktion) | |
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>) | |
| (C++23) |
gibt einen konstanten Iterator zum Anfang des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| (C++23) |
gibt ein Sentinel für den konstanten Iterator des Bereichs zurück (public member function of std::ranges::view_interface<D>) |
| 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>) | |
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>) | |
[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) | |
| (C++20) |
ein view, der aus der Sequenz besteht, die durch Abflachung eines view von ranges gebildet wird(Klassen-Template) (Range-Adaptor-Objekt) |