Ranges-Bibliothek (seit C++20)
Die Ranges-Bibliothek ist eine Erweiterung und Verallgemeinerung der Algorithmen- und Iterator-Bibliotheken, die sie leistungsfähiger macht, indem sie komponierbar und weniger fehleranfällig ist.
Die Bibliothek erstellt und manipuliert Range-Views, leichte Objekte, die iterierbare Sequenzen (Ranges) indirekt repräsentieren. Ranges sind eine Abstraktion über
-
[begin,end)– Iterator-Paare, z. B. Ranges, die durch implizite Konvertierung aus Containern erstellt wurden. Alle Algorithmen, die Iterator-Paare verwenden, haben nun Überladungen, die Ranges akzeptieren (z. B. ranges::sort) - begin
+[0,size)– gezählte Sequenzen, z. B. Range, zurückgegeben von views::counted -
[begin,predicate)– bedingt terminierte Sequenzen, z. B. Range, zurückgegeben von views::take_while -
[begin,..)– unbeschränkte Sequenzen, z. B. Range, zurückgegeben von views::iota
Die Ranges-Bibliothek enthält Range-Algorithmen, die auf Ranges eifrig angewendet werden, und Range-Adaptoren, die auf Views lazy angewendet werden. Adaptoren können zu Pipelines komponiert werden, sodass ihre Aktionen während der Iteration des Views stattfinden.
| Definiert in der Header-Datei <ranges> |
||
| namespace std { namespace views = ranges::views; |
(seit C++20) | |
Der Namespace-Alias std::views wird als Kurzform für std::ranges::views bereitgestellt.
| Definiert im Namespace
std::ranges | |
Bereichszugriff | |
| Definiert in der Header-Datei
<ranges> | |
| Definiert in Header
<iterator> | |
| (C++20) |
gibt einen Iterator zum Anfang eines Ranges zurück (Customization Point Objekt) |
| (C++20) |
gibt ein Sentinel zurück, das das Ende eines Ranges anzeigt (Customization Point Objekt) |
| (C++20) |
gibt einen Iterator zum Anfang eines schreibgeschützten Ranges zurück (Customization Point Objekt) |
| (C++20) |
gibt ein Sentinel zurück, das das Ende eines schreibgeschützten Ranges anzeigt (Customization Point Objekt) |
| (C++20) |
gibt einen Reverse-Iterator zu einem Range zurück (Customization Point Objekt) |
| (C++20) |
gibt einen Reverse-End-Iterator zu einem Range zurück (Customization Point Objekt) |
| (C++20) |
gibt einen Reverse-Iterator zu einem schreibgeschützten Range zurück (Customization Point Objekt) |
| (C++20) |
gibt einen Reverse-End-Iterator zu einem schreibgeschützten Range zurück (Customization Point Objekt) |
| (C++26) |
gibt eine Ganzzahl zurück, die dem von einem Range gegebenen Reserve-Hinweis entspricht (Customization Point Objekt) |
| (C++20) |
gibt eine Ganzzahl zurück, die der Größe eines Ranges entspricht (Customization Point Objekt) |
| (C++20) |
gibt eine vorzeichenbehaftete Ganzzahl zurück, die der Größe eines Ranges entspricht (Customization Point Objekt) |
| (C++20) |
prüft, ob ein Range leer ist (Customization Point Objekt) |
| (C++20) |
ruft einen Zeiger auf den Anfang eines zusammenhängenden Ranges ab (Customization Point Objekt) |
| (C++20) |
ruft einen Zeiger auf den Anfang eines schreibgeschützten zusammenhängenden Ranges ab (Customization Point Objekt) |
Range-Primitive | |
| Definiert in der Header-Datei
<ranges> | |
| (C++20)(C++23)(C++20)(C++23) |
ermittelt Iterator- und Sentinel-Typen eines Ranges (Alias-Template) |
| (C++20)(C++20)(C++20) |
ermittelt Größen-, Differenz- und Wertetypen eines Ranges (Alias-Template) |
| ermittelt Referenztypen eines Ranges (Alias-Template) | |
Behandlung von hängenden Iteratoren | |
| Definiert in der Header-Datei
<ranges> | |
| (C++20) |
ein Platzhaltertyp, der anzeigt, dass ein Iterator oder ein subrange nicht zurückgegeben werden sollte, da er hängen würde(Klasse) |
ermittelt den Iterator- oder subrange-Typ eines borrowed_range(Alias-Template) | |
Andere Hilfsprogramme | |
| Definiert in der Header-Datei
<ranges> | |
| (C++23) |
taggt einen Range, damit er als Sequenz und nicht als einzelner Wert behandelt wird (Klassen-Template) |
Range-Konzepte | |
| Definiert in der Header-Datei
<ranges> | |
| (C++20) |
spezifiziert, dass ein Typ ein Range ist, d. h. er stellt einen begin-Iterator und ein end-Sentinel bereit(Konzept) |
| (C++20) |
spezifiziert, dass ein Typ ein range ist und Iteratoren, die aus einem Ausdruck davon erhalten werden, sicher zurückgegeben werden können, ohne Gefahr des Hängens(Konzept) |
| spezifiziert, dass ein Range seine Größe in konstanter Zeit schätzen kann (Konzept) | |
| (C++20) |
spezifiziert, dass ein Range seine Größe in konstanter Zeit kennt (Konzept) |
| (C++20) |
spezifiziert, dass ein Range ein View ist, d. h. er hat konstante Zeit für Kopie/Verschiebung/Zuweisung (Konzept) |
| (C++20) |
spezifiziert einen Range, dessen Iteratortyp input_iterator erfüllt(Konzept) |
| (C++20) |
spezifiziert einen Range, dessen Iteratortyp output_iterator erfüllt(Konzept) |
| (C++20) |
spezifiziert einen Range, dessen Iteratortyp forward_iterator erfüllt(Konzept) |
| (C++20) |
spezifiziert einen Range, dessen Iteratortyp bidirectional_iterator erfüllt(Konzept) |
| (C++20) |
spezifiziert einen Range, dessen Iteratortyp random_access_iterator erfüllt(Konzept) |
| (C++20) |
spezifiziert einen Range, dessen Iteratortyp contiguous_iterator erfüllt(Konzept) |
| (C++20) |
spezifiziert, dass ein Range identische Iterator- und Sentinel-Typen hat (Konzept) |
| (C++20) |
spezifiziert die Anforderungen an einen range, der sicher in einen view konvertiert werden kann(Konzept) |
| (C++23) |
spezifiziert, dass ein Range schreibgeschützte Elemente hat (Konzept) |
Range-Konvertierungen | |
| Definiert in der Header-Datei
<ranges> | |
| (C++23) |
konstruiert ein neues Nicht-View-Objekt aus einem Input-Range (Funktions-Template) |
Ansichten | |
| Definiert in der Header-Datei
<ranges> | |
| (C++20) |
Hilfsklassen-Template zur Definition eines view unter Verwendung des Curiously Recurring Template Pattern(Klassen-Template) |
| (C++20) |
kombiniert ein Iterator-Sentinel-Paar zu einer view(Klassenschablone) |
[edit] Range-Fabriken
| Definiert in der Header-Datei
<ranges> | |
| Definiert im Namespace
std::ranges | |
eine leere view ohne Elemente(class template) (variable template) | |
eine view, die ein einzelnes Element eines bestimmten Wertes enthält(class template) (customization point object) | |
| (C++20) |
ein view, der eine Sequenz aus aufeinanderfolgenden Inkrementierungen eines Anfangswerts besteht(Klassen-Template) (Customization Point Objekt) |
ein view, der eine Sequenz aus der wiederholten Erzeugung desselben Werts besteht(Klassen-Template) (Customization Point Objekt) | |
ein view, der aus den Elementen besteht, die durch sukzessive Anwendung von operator>> auf den zugehörigen Eingabestrom erhalten werden(Klassen-Template) (Customization Point Objekt) | |
[edit] Range-Adaptoren
| Definiert in der Header-Datei
<ranges> | |
| Definiert im Namespace
std::ranges | |
| Hilfs-Basisklassen-Template zur Definition eines Range-Adaptor-Closure-Objekts (Klassen-Template) | |
| (C++20) |
ein view, der alle Elemente eines range enthält(Alias-Template) (Range-Adaptor-Objekt) |
| (C++20) |
ein view der Elemente eines anderen range(Klassen-Template) |
| (C++20) |
ein view mit exklusivem Besitz eines range(Klassen-Template) |
ein view einer Sequenz, der jedes Element in ein rvalue umwandelt(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view, der aus den Elementen eines range besteht, die ein Prädikat erfüllen(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view einer Sequenz, der eine Transformationsfunktion auf jedes Element anwendet(Klassen-Template) (Range-Adaptor-Objekt) | |
| (C++20) |
ein view, der aus den ersten N Elementen eines anderen view besteht(Klassen-Template) (Range-Adaptor-Objekt) |
ein view, der aus den anfänglichen Elementen eines anderen view besteht, bis zum ersten Element, für das ein Prädikat false zurückgibt(Klassen-Template) (Range-Adaptor-Objekt) | |
| (C++20) |
ein view, der aus Elementen eines anderen view besteht, wobei die ersten N Elemente übersprungen werden(Klassen-Template) (Range-Adaptor-Objekt) |
ein view, der aus den Elementen eines anderen view besteht, wobei die anfängliche Teilsequenz von Elementen übersprungen wird, bis zum ersten Element, bei dem das Prädikat false zurückgibt(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) |
ein view, der aus der Sequenz besteht, die durch Abflachung eines Views von Ranges gebildet wird, mit dem Trennzeichen zwischen den Elementen(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view, der aus der Verkettung der adaptierten Views besteht(Klassen-Template) (Customization Point Objekt) | |
| (C++20) |
erstellt einen Subrange aus einem Iterator und einer Anzahl (Customization Point Objekt) |
konvertiert einen view in einen common_range(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view, der über die Elemente eines anderen bidirektionalen Views in umgekehrter Reihenfolge iteriert(Klassen-Template) (Range-Adaptor-Objekt) | |
konvertiert einen view in einen constant_range(Klassen-Template) (Range-Adaptor-Objekt) | |
nimmt einen view von tuple-ähnlichen Werten und eine Zahl N und erzeugt einen view des N-ten Elements jedes Tupels(Klassen-Template) (Range-Adaptor-Objekt) | |
| (C++20) |
nimmt einen view von Paar-ähnlichen Werten und erzeugt einen view der ersten Elemente jedes Paares(Klassen-Template) (Range-Adaptor-Objekt) |
nimmt einen view von Paar-ähnlichen Werten und erzeugt einen view der zweiten Elemente jedes Paares(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view, der jedes Element einer adaptierten Sequenz auf ein Tupel aus sowohl der Position als auch dem Wert des Elements abbildet(Klassen-Template) (Range-Adaptor-Objekt) | |
| (C++23) |
ein view, der aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views besteht(Klassen-Template) (Customization Point Objekt) |
ein view, der aus den Ergebnissen der Anwendung einer Transformationsfunktion auf entsprechende Elemente der adaptierten Views besteht(Klassen-Template) (Customization Point Objekt) | |
ein view, der aus Tupeln von Referenzen auf benachbarte Elemente des adaptierten Views besteht(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view, der aus den Ergebnissen der Anwendung einer Transformationsfunktion auf benachbarte Elemente des adaptierten Views besteht(Klassen-Template) (Range-Adaptor-Objekt) | |
eine Reihe von views, die N-elementige, nicht überlappende, aufeinanderfolgende Blöcke von Elementen einer anderen view sind(Klassenschablone) (Range-Adaptor-Objekt) | |
eine view, deren M-tes Element eine view über die M-ten bis (M + N - 1)-ten Elemente einer anderen view ist(Klassenschablone) (Range-Adaptor-Objekt) | |
teilt die view in Teilbereiche zwischen jedem Paar benachbarter Elemente auf, für die das gegebene Prädikat false zurückgibt(Klassenschablone) (Range-Adaptor-Objekt) | |
eine view, die aus Elementen einer anderen view besteht und dabei jeweils N Elemente überspringt(Klassenschablone) (Range-Adaptor-Objekt) | |
eine view, die aus Tupeln von Ergebnissen besteht, welche durch das n-äre kartesische Produkt der angepassten Views berechnet werden(Klassenschablone) (Customization Point Objekt) | |
eine view, die das zuletzt abgerufene Element ihrer zugrundeliegenden Sequenz zwischenspeichert(Klassenschablone) (Range-Adaptor-Objekt) | |
konvertiert eine view in einen Bereich, der nur input_range ist und kein common_range(Klassenschablone) (Range-Adaptor-Objekt) | |
[bearbeiten] Range-Generatoren (seit C++23)
| Definiert in Header
<generator> | |
| Definiert im Namespace
std | |
| (C++23) |
Eine view, die einen synchronen Coroutine-Generator repräsentiert(Klassentemplate) |
[bearbeiten] Hilfselemente
[bearbeiten] Range-Adaptor-Objekte
Siehe RangeAdaptorObject (RAO).
[bearbeiten] Range-Adaptor-Closure-Objekte
Siehe RangeAdaptorClosureObject (RACO).
[bearbeiten] Customization Point Objekte
Siehe Customization Point Objekt (CPO).
[bearbeiten] Zuweisbarer Wrapper
Einige Range-Adaptoren umschließen ihre Elemente oder Funktions-Objekte mit dem copyable-box(bis C++23)movable-box(seit C++23). Der Wrapper ergänzt das umschlossene Objekt bei Bedarf um Zuweisbarkeit.
[bearbeiten] Nicht-propagierender Cache
Einige Range-Adaptoren werden im Sinne einer Exposition-only Klassenschablone non-propagating-cache beschrieben, die sich fast wie std::optional<T> verhält (siehe Beschreibung für Unterschiede).
[bearbeiten] Bedingt-const Typ
template< bool Const, class T > using /*maybe-const*/ = std::conditional_t<Const, const T, T>; |
(nur Exposition*) | |
Die Alias-Schablone /*maybe-const*/ ist eine Abkürzung, die verwendet wird, um bedingt einen const-Qualifikator auf den Typ T anzuwenden.
[bearbeiten] Integer-ähnliche Typ-Hilfsschablonen
template< /*is-integer-like*/ T > using /*make-signed-like-t*/<T> = /* siehe Beschreibung */; |
(1) | (nur Exposition*) |
template< /*is-integer-like*/ T > using /*make-unsigned-like-t*/<T> = /* siehe Beschreibung */; |
(2) | (nur Exposition*) |
template< /*is-integer-like*/ T > /*make-unsigned-like-t*/<T> /*to-unsigned-like*/( T t ) |
(3) | (nur Exposition*) |
T- Wenn
Tein ganzzahliger Typ ist, ist /*make-signed-like-t*/<T> std::make_signed_t<T>. - Andernfalls ist /*make-signed-like-t*/<T> ein entsprechender, nicht spezifizierter vorzeichenbehafteter Integer-ähnlicher Typ gleicher Breite wie
T.
T- Wenn
Tein ganzzahliger Typ ist, ist /*make-unsigned-like-t*/<T> std::make_unsigned_t<T>. - Andernfalls ist /*make-signed-like-t*/<T> ein entsprechender, nicht spezifizierter vorzeichenloser Integer-ähnlicher Typ gleicher Breite wie
T.
[bearbeiten] Customization Point Objekt-Helfer
template< ranges::input_range R > constexpr auto& /*possibly-const-range*/(R& r) noexcept |
(1) | (nur Exposition*) |
template< class T > constexpr auto /*as-const-pointer*/( const T* p ) noexcept |
(2) | (nur Exposition*) |
Einige Range-Access-Customization-Point-Objekte werden im Sinne dieser Exposition-only Funktionsschablonen beschrieben.
input_range modelliert; andernfalls gibt es r ohne Casting zurück.[bearbeiten] Range-Adaptor-Helfer
template< class F, class Tuple > constexpr auto /*tuple-transform*/( F&& f, Tuple&& tuple ) |
(1) | (nur Exposition*) |
template< class F, class Tuple > constexpr void /*tuple-for-each*/( F&& f, Tuple&& tuple ) |
(2) | (nur Exposition*) |
template< class T > constexpr T& /*as-lvalue*/( T&& t ) |
(3) | (nur Exposition*) |
Einige Range-Adaptoren werden im Sinne dieser Exposition-only Funktionsschablonen beschrieben.
[bearbeiten] Hilfs-Konzepte
Die folgenden Exposition-only Konzepte werden für mehrere Typen verwendet, sind aber keine Bestandteile der Schnittstelle der Standardbibliothek.
template< class R > concept /*simple-view*/ = |
(1) | (nur Exposition*) |
template< class I > concept /*has-arrow*/ = |
(2) | (nur Exposition*) |
template< class T, class U > concept /*different-from*/ = |
(3) | (nur Exposition*) |
template< class R > concept /*range-with-movable-references*/ = |
(4) | (nur Exposition*) |
template< bool C, class... Views > concept /*all-random-access*/ = |
(5) | (nur Exposition*) |
template< bool C, class... Views > concept /*all-bidirectional*/ = |
(6) | (nur Exposition*) |
template< bool C, class... Views > concept /*all-forward*/ = |
(7) | (nur Exposition*) |
[bearbeiten] Hinweise
[bearbeiten] Beispiel
#include <iostream> #include <ranges> int main() { auto const ints = {0, 1, 2, 3, 4, 5}; auto even = [](int i) { return 0 == i % 2; }; auto square = [](int i) { return i * i; }; // the "pipe" syntax of composing the views: for (int i : ints | std::views::filter(even) | std::views::transform(square)) std::cout << i << ' '; std::cout << '\n'; // a traditional "functional" composing syntax: for (int i : std::views::transform(std::views::filter(ints, even), square)) std::cout << i << ' '; }
Ausgabe
0 4 16 0 4 16
[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 |
|---|---|---|---|
| LWG 3509 (P2281R1) |
C++20 | war unklar, wie Range-Adaptor-Objekte nachfolgende Argumente binden | sie werden gebunden per Wert |
| LWG 3948 | C++23 | possibly-const-range und as-const-pointerwaren nicht als noexcept deklariert |
als noexcept deklariert |
| LWG 4027 | C++23 | possibly-const-range würde keine const-Qualifikation hinzufügenfür Ranges, die bereits constant_range modelliert haben |
fügt const-Qualifikation hinzu für solche Ranges |
| LWG 4112 | C++20 | has-arrow erforderte nicht, dass i const-qualifiziert ist |
requires |