std::ranges::views::split, std::ranges::split_view
| Definiert in der Header-Datei <ranges> |
||
| template< ranges::forward_range V, ranges::forward_range Pattern > requires ranges::view<V> && |
(1) | (seit C++20) |
| namespace views { inline constexpr /* nicht spezifiziert */ split = /* nicht spezifiziert */; |
(2) | (seit C++20) |
| Aufruf-Signatur |
||
| template< ranges::viewable_range R, class Pattern > requires /* siehe unten */ |
(seit C++20) | |
| template< class Pattern > constexpr /* Range-Adapter-Closure */ split( Pattern&& pattern ); |
(seit C++20) | |
split_view nimmt eine view und ein Trennzeichen entgegen und teilt die view anhand des Trennzeichens in Teilbereiche auf.split_view modelliert die Konzepte forward_range und common_range, wenn die zugrunde liegende view V die entsprechenden Konzepte modelliert.
Der innere Bereich (ranges::range_reference_t<split_view>) ist eine ranges::subrange<ranges::iterator_t<V>>, die common_range modelliert, sized_range modelliert, wenn ranges::iterator_t<V> std::sized_sentinel_for<ranges::iterator_t<V>> modelliert, und contiguous_range, random_access_range, bidirectional_range und forward_range modelliert, wenn V die entsprechenden Konzepte modelliert.
Im Gegensatz zu lazy_split_view behält split_view die Kontinuität des Teilbereichs bei, was es für das Aufteilen von Zeichenketten geeignet macht.
Inhalt |
[bearbeiten] Datenmember
| Mitglied | Beschreibung |
V base_ (private) |
die zugrunde liegende (angepasste) view((exposition-only member object*) |
Pattern pattern_ (privat) |
das Musterobjekt, das als Trennzeichen zum Aufteilen der zugrunde liegenden view verwendet wird((exposition-only member object*) |
non-propagating-cache<ranges::subrange <ranges::iterator_t<V>>> cached_begin_ (privat) |
ein Objekt, das das Ergebnis des ersten Aufrufs von begin() zwischenspeichert((exposition-only member object*) |
[bearbeiten] Memberfunktionen
konstruiert eine 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) | |
| sucht nach dem nächsten Vorkommen des Musters (exposition-only 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] Geschachtelte Klassen
| der Iterator-Typ ((nur zur Veranschaulichung)*) | |
| der Sentinel-Typ ((nur zur Veranschaulichung)*) |
[bearbeiten] Deduction Guides
[bearbeiten] Hinweise
Vor P2210R2 verwendete split_view einen faulen Mechanismus zum Aufteilen und konnte daher die Eigenschaften der zugrunde liegenden View bezüglich Bidirektionalität, Random Access oder Kontinuität nicht beibehalten oder den Iterator-Typ des inneren Bereichs mit dem der zugrunde liegenden View gleichsetzen. Folglich wurde sie durch P2210R2 neu gestaltet und der faule Mechanismus wurde zu lazy_split_view verschoben.
Das Trennzeichen pattern sollte im Allgemeinen kein einfacher String-Literal sein, da es das Nullterminierungszeichen als notwendigen Teil des Trennzeichens betrachtet; daher ist es ratsam, stattdessen ein std::string_view Literal zu verwenden.
[bearbeiten] Beispiel
#include <iomanip> #include <iostream> #include <ranges> #include <string_view> int main() { using std::operator""sv; constexpr auto words{"Hello^_^C++^_^20^_^!"sv}; constexpr auto delim{"^_^"sv}; for (const auto word : std::views::split(words, delim)) // with string_view's C++23 range constructor: std::cout << std::quoted(std::string_view(word)) << ' '; std::cout << '\n'; }
Ausgabe
"Hello" "C++" "20" "!"
[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 einfach verwendet zu werden |
sie wurde neu gestaltet |
[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) |