Namensräume
Varianten
Aktionen

std::ranges::views::split, std::ranges::split_view

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
 
Definiert in der Header-Datei <ranges>
template< ranges::forward_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>
class split_view

    : public ranges::view_interface<split_view<V, Pattern>>
(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 */

constexpr ranges::view auto split( R&& r, Pattern&& pattern );
(seit C++20)
template< class Pattern >
constexpr /* Range-Adapter-Closure */ split( Pattern&& pattern );
(seit C++20)
1) split_view nimmt eine view und ein Trennzeichen entgegen und teilt die view anhand des Trennzeichens in Teilbereiche auf.
2) RangeAdaptorObject. Der Ausdruck views::split(e, p) ist für beliebige geeignete Teilausdrücke e und p ausdrucksäquivalent zu split_view(e, p).

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) [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]
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>) [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] 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)[edit]
ein view, der aus der Sequenz besteht, die durch Abflachung eines view von ranges gebildet wird
(Klassen-Template) (Range-Adaptor-Objekt)[edit]