Ranges library (since C++20)
Die Ranges-Bibliothek ist eine Erweiterung und Verallgemeinerung der Algorithmen- und Iterator-Bibliotheken, die sie durch bessere Komponierbarkeit und weniger Fehleranfälligkeit leistungsfähiger macht.
Die Bibliothek erstellt und manipuliert Bereichs- views , leichtgewichtige Objekte, die indirekt iterierbare Sequenzen ( ranges ) repräsentieren. Bereiche sind eine Abstraktionsebene über
-
[begin,end)– Iterator-Paare, z.B. Bereiche, die durch implizite Konvertierung von Containern erstellt werden. Alle Algorithmen, die Iterator-Paare akzeptieren, haben jetzt Überladungen, die Bereiche akzeptieren (z.B. ranges::sort ) -
begin
+[ 0 ,size)– Gezählte Sequenzen, z.B. Bereich zurückgegeben durch views::counted -
[begin,predicate)– Bedingt beendete Sequenzen, z.B. Bereich zurückgegeben durch views::take_while -
[begin,..)– Unbegrenzte Sequenzen, z.B. Bereich zurückgegeben durch views::iota
Die Ranges-Bibliothek enthält Range-Algorithmen , die sofort auf Ranges angewendet werden, und Range-Adaptoren , die verzögert auf Views angewendet werden. Adaptoren können zu Pipelines zusammengesetzt werden, sodass ihre Aktionen beim Iterieren des Views stattfinden.
|
Definiert im Header
<ranges>
|
||
|
namespace
std
{
namespace
views
=
ranges
::
views
;
|
(seit C++20) | |
Der Namensbereichs-Alias
std::views
wird als Kurzform für
std::ranges::views
bereitgestellt.
|
Definiert im namespace
std::ranges
|
|
Range access |
|
|
Definiert im Header
<ranges>
|
|
|
Definiert im Header
<iterator>
|
|
|
(C++20)
|
gibt einen Iterator zum Anfang eines Bereichs zurück
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt einen Sentinel zurück, der das Ende eines Bereichs anzeigt
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt einen Iterator zum Anfang eines schreibgeschützten Bereichs zurück
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt einen Sentinel zurück, der das Ende eines schreibgeschützten Bereichs anzeigt
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt einen Reverse-Iterator für einen Bereich zurück
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt einen umgekehrten End-Iterator für einen Bereich zurück
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt einen Reverse-Iterator für einen schreibgeschützten Bereich zurück
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt einen umgekehrten End-Iterator für einen schreibgeschützten Bereich zurück
(Anpassungspunktobjekt) |
|
(C++26)
|
gibt einen Integer-Wert gleich dem Reserve-Hinweis zurück, der von einem Range gegeben wird
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt eine Ganzzahl gleich der Größe eines Bereichs zurück
(Anpassungspunktobjekt) |
|
(C++20)
|
gibt einen vorzeichenbehafteten Integer zurück, der gleich der Größe eines Ranges ist
(Anpassungspunktobjekt) |
|
(C++20)
|
prüft, ob ein Bereich leer ist
(Anpassungspunktobjekt) |
|
(C++20)
|
erhält einen Zeiger auf den Anfang eines zusammenhängenden Bereichs
(Anpassungspunktobjekt) |
|
(C++20)
|
erhält einen Zeiger auf den Anfang eines schreibgeschützten zusammenhängenden Bereichs
(Anpassungspunktobjekt) |
Bereichsprimitive |
|
|
Definiert im Header
<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 Werttypen eines Ranges
(Alias-Template) |
|
(C++20)
(C++23)
(C++20)
(C++20)
|
erhält Referenztypen eines Bereichs
(Alias-Template) |
Behandlung hängender Iteratoren |
|
|
Definiert im Header
<ranges>
|
|
|
(C++20)
|
Ein Platzhaltertyp, der anzeigt, dass ein Iterator oder ein
subrange
nicht zurückgegeben werden sollte, da er verwaist wäre
(Klasse) |
Ermittelt den Iteratortyp oder
subrange
-Typ eines
borrowed_range
(Alias-Template) |
|
Weitere Hilfsmittel |
|
|
Definiert im Header
<ranges>
|
|
|
(C++23)
|
kennzeichnet einen Bereich, der als Sequenz statt als einzelner Wert behandelt werden soll
(Klassentemplate) |
Range-Konzepte |
|
|
Definiert im Header
<ranges>
|
|
|
(C++20)
|
gibt an, dass ein Typ ein Range ist, das heißt, es stellt einen
begin
Iterator und einen
end
Sentinel bereit
(Konzept) |
|
(C++20)
|
spezifiziert, dass ein Typ ein
range
ist und Iteratoren, die von einem Ausdruck davon erhalten werden, sicher zurückgegeben werden können ohne Gefahr von Dangling
(Konzept) |
|
gibt an, dass ein Bereich seine Größe in konstanter Zeit schätzen kann
(Konzept) |
|
|
(C++20)
|
spezifiziert, dass ein Bereich seine Größe in konstanter Zeit kennt
(Konzept) |
|
(C++20)
|
gibt an, dass ein Range eine View ist, d.h. es hat konstante Zeit für Kopieren/Verschieben/Zuweisen
(Konzept) |
|
(C++20)
|
spezifiziert einen Bereich, dessen Iteratortyp
input_iterator
erfüllt
(Konzept) |
|
(C++20)
|
spezifiziert einen Bereich, dessen Iteratortyp
output_iterator
erfüllt
(Konzept) |
|
(C++20)
|
spezifiziert einen Bereich, dessen Iteratortyp
forward_iterator
erfüllt
(Konzept) |
|
(C++20)
|
spezifiziert einen Bereich, dessen Iteratortyp
bidirectional_iterator
erfüllt
(Konzept) |
|
(C++20)
|
spezifiziert einen Bereich, dessen Iteratortyp
random_access_iterator
erfüllt
(Konzept) |
|
(C++20)
|
spezifiziert einen Bereich, dessen Iteratortyp
contiguous_iterator
erfüllt
(Konzept) |
|
(C++20)
|
spezifiziert, dass ein Range identische Iterator- und Sentinel-Typen besitzt
(Konzept) |
|
(C++20)
|
spezifiziert die Anforderungen dafür, dass ein
range
sicher in eine
view
konvertierbar ist
(Konzept) |
|
(C++23)
|
spezifiziert, dass ein Bereich schreibgeschützte Elemente besitzt
(Konzept) |
Bereichskonvertierungen |
|
|
Definiert im Header
<ranges>
|
|
|
(C++23)
|
Konstruiert ein neues Nicht-View-Objekt aus einem Eingabebereich
(Funktions-Template) |
Ansichten |
|
|
Definiert im Header
<ranges>
|
|
|
(C++20)
|
Hilfsklassen-Template zur Definition einer
view
unter Verwendung des
Curiously Recurring Template Pattern
(Klassen-Template) |
|
(C++20)
|
kombiniert ein Iterator-Sentinel-Paar zu einer
view
(Klassentemplate) |
Range-Fabriken
|
Definiert im Header
<ranges>
|
|
|
Definiert im Namensraum
std::ranges
|
|
|
(C++20)
|
eine leere
view
ohne Elemente
(Klassen-Template) (Variablen-Template) |
eine
view
die ein einzelnes Element eines bestimmten Werts enthält
(Klassen-Template) (Anpassungspunkt-Objekt) |
|
|
(C++20)
|
eine
view
bestehend aus einer Sequenz, die durch wiederholtes Inkrementieren eines Anfangswerts erzeugt wird
(Klassen-Template) (Anpassungspunkt-Objekt) |
eine
view
bestehend aus einer generierten Sequenz durch wiederholtes Erzeugen desselben Werts
(Klassen-Template) (Anpassungspunkt-Objekt) |
|
eine
view
bestehend aus den Elementen, die durch sukzessive Anwendung von
operator>>
auf den assoziierten Eingabestrom erhalten werden
(Klassen-Template) (Anpassungspunkt-Objekt) |
|
Bereichsadapter
|
Definiert im Header
<ranges>
|
|
|
Definiert im namespace
std::ranges
|
|
|
(C++23)
|
Hilfsklassen-Template zur Definition eines Range-Adaptor-Closure-Objekts
(Klassen-Template) |
|
(C++20)
|
eine
view
, die alle Elemente eines
range
enthält
(Alias-Template) (Range-Adapter-Objekt) |
|
(C++20)
|
eine
view
der Elemente eines anderen
range
(Klassentemplate) |
|
(C++20)
|
eine
view
mit exklusivem Besitz eines
range
(Klassentemplate) |
eine
view
einer Sequenz, die jedes Element zu einem Rvalue castet
(Klassentemplate) (Range-Adaptor-Objekt) |
|
eine
view
, die aus den Elementen eines
range
besteht, die ein Prädikat erfüllen
(Klassentemplate) (Range-Adapter-Objekt) |
|
eine
view
einer Sequenz, die eine Transformationsfunktion auf jedes Element anwendet
(Klassen-Template) (Range-Adapter-Objekt) |
|
|
(C++20)
|
eine
view
bestehend aus den ersten N Elementen einer anderen
view
(Klassentemplate) (Range-Adapter-Objekt) |
eine
view
, bestehend aus den Anfangselementen einer anderen
view
, bis zum ersten Element, bei dem ein Prädikat
false
zurückgibt
(Klassentemplate) (Range-Adapter-Objekt) |
|
|
(C++20)
|
eine
view
, bestehend aus Elementen einer anderen
view
, die die ersten N Elemente überspringt
(Klassentemplate) (Range-Adapter-Objekt) |
eine
view
, bestehend aus den Elementen einer anderen
view
, die das anfängliche Teilsequenz von Elementen überspringt, bis zum ersten Element, wo das Prädikat
false
zurückgibt
(Klassen-Template) (Range-Adapter-Objekt) |
|
|
(C++20)
|
eine
view
bestehend aus der durch Glätten einer
view
von
range
s
erhaltenen Sequenz
(Klassentemplate) (Range-Adapter-Objekt) |
eine
view
bestehend aus der Sequenz, die durch das Abflachen einer View von Ranges erhalten wird, mit dem Trennzeichen zwischen Elementen
(Klassentemplate) (Range-Adapter-Objekt) |
|
eine
view
über die Teilbereiche, die durch Aufteilung einer anderen
view
mittels eines Trennzeichens erhalten werden
(Klassentemplate) (Range-Adapter-Objekt) |
|
|
(C++20)
|
eine
view
über die Teilbereiche, die durch Aufteilung einer anderen
view
mittels eines Trennzeichens erhalten werden
(Klassentemplate) (Range-Adapter-Objekt) |
eine
view
bestehend aus der Verkettung der angepassten Views
(Klassentemplate) (Customization Point Object) |
|
|
(C++20)
|
erstellt einen Subrange aus einem Iterator und einer Anzahl
(Anpassungspunktobjekt) |
wandelt eine
view
in einen
common_range
um
(Klassentemplate) (Range-Adapter-Objekt) |
|
eine
view
, die über die Elemente einer anderen bidirektionalen Ansicht in umgekehrter Reihenfolge iteriert
(Klassentemplate) (Range-Adapter-Objekt) |
|
wandelt eine
view
in einen
constant_range
um
(Klassentemplate) (Range-Adapter-Objekt) |
|
Nimmt eine
view
bestehend aus
tuple-like
Werten und eine Zahl N und erzeugt eine
view
des N
ten
Elements jedes Tupels
(Klassentemplate) (Range-Adapter-Objekt) |
|
|
(C++20)
|
nimmt eine
view
bestehend aus paarartigen Werten und erzeugt eine
view
der ersten Elemente jedes Paares
(Klassentemplate) (Range-Adapter-Objekt) |
nimmt eine
view
bestehend aus paarartigen Werten und erzeugt eine
view
der zweiten Elemente jedes Paares
(Klassen-Template) (Range-Adapter-Objekt) |
|
eine
view
, die jedes Element der adaptierten Sequenz auf ein Tupel aus der Position des Elements und seinem Wert abbildet
(Klassentemplate) (Range-Adapter-Objekt) |
|
|
(C++23)
|
eine
view
bestehend aus Tupeln von Referenzen auf entsprechende Elemente der adaptierten Views
(Klassentemplate) (Customization Point Object) |
eine
view
bestehend aus Ergebnissen der Anwendung einer Transformationsfunktion auf entsprechende Elemente der adaptierten Views
(Klassentemplate) (Customization Point Object) |
|
eine
view
bestehend aus Tupeln von Referenzen auf benachbarte Elemente der adaptierten view
(Klassentemplate) (Range-Adaptor-Objekt) |
|
eine
view
bestehend aus Ergebnissen der Anwendung einer Transformationsfunktion auf benachbarte Elemente der adaptierten view
(Klassentemplate) (Range-Adapter-Objekt) |
|
|
(C++23)
|
ein Bereich von
view
s
, die
N
-große, nicht überlappende aufeinanderfolgende Teile der Elemente einer anderen
view
darstellen
(Klassentemplate) (Range-Adapter-Objekt) |
|
(C++23)
|
eine
view
deren M
tes
Element eine
view
über das M
te
bis (M + N - 1)
te
Element einer anderen
view
ist
(Klassentemplate) (Range-Adapter-Objekt) |
teilt die
view
in Subranges zwischen jedem Paar benachbarter Elemente auf, für die das gegebene Prädikat
false
zurückgibt
(Klassentemplate) (Range-Adapter-Objekt) |
|
eine
view
, bestehend aus Elementen einer anderen
view
, die schrittweise über N Elemente voranschreitet
(Klassentemplate) (Range-Adapter-Objekt) |
|
eine
view
bestehend aus Tupeln von Ergebnissen, die durch das n-äre kartesische Produkt der adaptierten Views berechnet werden
(Klassentemplate) (Anpassungspunktobjekt) |
|
eine
view
, die das zuletzt abgerufene Element ihrer zugrundeliegenden Sequenz zwischenspeichert
(Klassentemplate) (Range-Adapter-Objekt) |
|
wandelt eine
view
in einen Bereich um, der
ausschließlich ein
input_range
und kein
common_range
ist
(Klassentemplate) (Range-Adapter-Objekt) |
|
Bereichsgeneratoren (seit C++23)
|
Definiert im Header
<generator>
|
|
|
Definiert im Namespace
std
|
|
|
(C++23)
|
Eine
view
, die einen synchronen
Coroutine
-Generator repräsentiert
(Klassentemplate) |
Hilfsobjekte
Bereichsadapter-Objekte
Siehe RangeAdaptorObject (RAO).
Bereichsadapter-Abschluss-Objekte
Siehe RangeAdaptorClosureObject (RACO).
Customization Point Objects
Siehe Customization point object (CPO).
Zuweisungsfähiger Wrapper
Einige Bereichsadapter umschließen ihre Elemente oder Funktionsobjekte mit dem
copyable-box
(bis C++23)
movable-box
(seit C++23)
. Der Wrapper erweitert das umschlossene Objekt bei Bedarf um Zuweisbarkeit.
Nicht-verbreitender Cache
Einige Bereichsadapter werden mittels einer nur zur Darstellung dienenden Klassenvorlage
non-propagating-cache
spezifiziert, die sich nahezu wie
std::
optional
<
T
>
verhält (siehe Beschreibung für Unterschiede).
Bedingt-
const
Typ
|
template
<
bool
Const,
class
T
>
using /*maybe-const*/ = std:: conditional_t < Const, const T, T > ; |
( Nur zur Darstellung* ) | |
Die Alias-Vorlage
/*maybe-const*/
ist eine Kurzschreibweise, die verwendet wird, um bedingt einen
const
Qualifizierer auf den Typ
T
anzuwenden.
Integer-ähnliche Typ-Helfer-Templates
|
template
<
/*is-integer-like*/
T
>
using /*make-signed-like-t*/ < T > = /* siehe Beschreibung */ ; |
(1) | ( nur zur Darstellung* ) |
|
template
<
/*is-integer-like*/
T
>
using /*make-unsigned-like-t*/ < T > = /* siehe Beschreibung */ ; |
(2) | ( nur zur Darstellung* ) |
|
template
<
/*is-integer-like*/
T
>
/*make-unsigned-like-t*/
<
T
>
/*to-unsigned-like*/
(
T t
)
|
(3) | ( nur zur Darstellung* ) |
T
:
-
Wenn
Tein Integer-Typ ist, /*make-signed-like-t*/ < T > ist std:: make_signed_t < T > . -
Andernfalls ist
/*make-signed-like-t*/
<
T
>
ein entsprechender nicht spezifizierter signed-integer-like type mit derselben Breite wie
T.
T
:
-
Wenn
Tein Ganzzahltyp ist, dann ist /*make-unsigned-like-t*/ < T > gleich std:: make_unsigned_t < T > . -
Andernfalls ist
/*make-unsigned-like-t*/
<
T
>
ein entsprechender nicht näher spezifizierter vorzeichenloser Ganzzahl-ähnlicher Typ mit derselben Breite wie
T.
Customization Point Object Helfer
|
template
<
ranges::
input_range
R
>
constexpr
auto
&
/*möglicherweise-konstante-Bereich*/
(
R
&
r
)
noexcept
|
(1) | ( Nur zur Darstellung* ) |
|
template
<
class
T
>
constexpr
auto
/*als-konstante-Zeiger*/
(
const
T
*
p
)
noexcept
|
(2) | ( Nur zur Darstellung* ) |
Einige Bereichszugriffs-Anpassungspunktobjekte werden in Bezug auf diese nur zur Darstellung dienenden Funktionsvorlagen spezifiziert.
input_range
erfüllt; andernfalls wird
r
ohne jegliche Typumwandlung zurückgegeben.
Bereichsadapter-Hilfsmittel
|
template
<
class
F,
class
Tuple
>
constexpr
auto
/*tuple-transform*/
(
F
&&
f, Tuple
&&
tuple
)
|
(1) | ( Nur zur Darstellung* ) |
|
template
<
class
F,
class
Tuple
>
constexpr
void
/*tuple-for-each*/
(
F
&&
f, Tuple
&&
tuple
)
|
(2) | ( exposition only* ) |
|
template
<
class
T
>
constexpr
T
&
/*als-lvalue*/
(
T
&&
t
)
|
(3) | ( Nur zur Darstellung* ) |
Einige Bereichsadapter werden in Bezug auf diese nur zur Darstellung dienenden Funktionsvorlagen spezifiziert.
Hilfskonzepte
Die folgenden ausschließlich expository Konzepte werden für mehrere Typen verwendet, sind jedoch nicht Teil der Schnittstelle der Standardbibliothek.
|
template
<
class
R
>
Konzept
/*simple-view*/
=
|
(1) | ( nur zur Darstellung* ) |
|
template
<
class
I
>
concept
/*has-arrow*/
=
|
(2) | ( nur zur Darstellung* ) |
|
template
<
class
T,
class
U
>
concept
/*different-from*/
=
|
(3) | ( Nur zur Darstellung* ) |
|
template
<
class
R
>
Konzept
/*range-with-movable-references*/
=
|
(4) | ( nur zur Darstellung* ) |
|
template
<
bool
C,
class
...
Views
>
Konzept
/*all-random-access*/
=
|
(5) | ( Nur zur Darstellung* ) |
|
template
<
bool
C,
class
...
Views
>
Konzept
/*all-bidirectional*/
=
|
(6) | ( Nur zur Darstellung* ) |
|
template
<
bool
C,
class
...
Views
>
Konzept
/*all-forward*/
=
|
(7) | ( Nur zur Darstellung* ) |
Hinweise
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; }; // die "Pipe"-Syntax zur Komposition der Views: for (int i : ints | std::views::filter(even) | std::views::transform(square)) std::cout << i << ' '; std::cout << '\n'; // eine traditionelle "funktionale" Kompositionssyntax: for (int i : std::views::transform(std::views::filter(ints, even), square)) std::cout << i << ' '; }
Ausgabe:
0 4 16 0 4 16
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
|
LWG 3509
( P2281R1 ) |
C++20 | Es war unklar, wie Range-Adapter-Objekte nachfolgende Argumente binden |
Sie werden
als Wert gebunden |
| LWG 3948 | C++23 |
possibly-const-range
und
as-const-pointer
waren nicht als noexcept deklariert |
Als noexcept deklariert |
| LWG 4027 | C++23 |
possibly-const-range
würde keine Const-Qualifizierung hinzufügen
für Ranges, die bereits
constant_range
modelliert haben
|
Fügt Const-Qualifizierung
für solche Ranges hinzu |
| LWG 4112 | C++20 |
has-arrow
erforderte nicht, dass
i
const-qualifiziert ist
|
Erfordert es |