Eingeschränkte Algorithmen (seit C++20)
C++20 bietet eingeschränkte Versionen der meisten Algorithmen im Namensraum std::ranges. Bei diesen Algorithmen kann ein Bereich entweder als Iterator-Sentinel-Paar oder als ein einzelnes Bereichsargument angegeben werden, und Projektionen und Pointer-to-Member-Aufrufbare werden unterstützt. Zusätzlich wurden die Rückgabetypen der meisten Algorithmen geändert, um alle potenziell nützlichen Informationen zurückzugeben, die während der Ausführung des Algorithmus berechnet wurden.
Algorithmus-Funktionsobjekte
Ein Algorithmus-Funktionsobjekt (AFO), informell auch Niebloid genannt, ist ein Customization-Point-Objekt (CPO), das als eine oder mehrere überladene Funktionsschablonen spezifiziert ist.
Für ein Algorithmus-Funktionsobjekt o sei S die entsprechende Menge von Funktionsschablonen. Dann ist für jede Argumentfolge args... o(args...) ausdrucksäquivalent zu s(args...), wobei das Ergebnis der Namenssuche nach s die Überladungsmenge S ist.
Die eingeschränkten Algorithmen im Namensbereich std::ranges sind als Algorithmus-Funktionsobjekte definiert. Daraus folgt:
- Explizite Vorlagenargumentlisten können beim Aufruf keiner von ihnen angegeben werden.
- Keine von ihnen ist für die argumentsabhängige Namenssuche sichtbar.
- Wenn eine von ihnen durch normale unqualifizierte Namenssuche als Name links vom Funktionsaufrufoperator gefunden wird, wird die argumentsabhängige Namenssuche unterdrückt.
Range-Parameter
Einige Überladungen nehmen Bereich-Argumente, sie verhalten sich, als ob sie durch Weiterleitung an die entsprechende Überladung im Namensraum ranges implementiert wären, die separate Iterator- und Sentinel-Argumente nimmt, wobei für jedes Bereichsargument r:
- Das entsprechende Iterator-Argument wird mit
ranges::begin(r)initialisiert.
|
(bis C++26) |
|
(seit C++26) |
Nicht-modifizierende Sequenzoperationen
Definiert in Header
<algorithm> | |
Definiert in Namensraum
std::ranges | |
Batch-Operationen | |
(C++20) |
wendet ein unäres Funktionsobjekt auf Elemente aus einem Bereich an (Algorithmus-Funktionsobjekt) |
(C++20) |
wendet ein Funktionsobjekt auf die ersten N Elemente einer Sequenz an (Algorithmus-Funktionsobjekt) |
Suchoperationen | |
(C++20)(C++20)(C++20) |
prüft, ob ein Prädikat true für alle, einige oder keines der Elemente in einem Bereich ist(Algorithmus-Funktionsobjekt) |
(C++23)(C++23) |
prüft, ob der Bereich das angegebene Element oder den angegebenen Teilbereich enthält (Algorithmus-Funktionsobjekt) |
(C++20)(C++20)(C++20) |
findet das erste Element, das bestimmte Kriterien erfüllt (Algorithmus-Funktionsobjekt) |
(C++23)(C++23)(C++23) |
findet das letzte Element, das bestimmte Kriterien erfüllt (Algorithmus-Funktionsobjekt) |
(C++20) |
findet die letzte Folge von Elementen in einem bestimmten Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
sucht nach einem beliebigen Element aus einer Menge von Elementen (Algorithmus-Funktionsobjekt) |
(C++20) |
findet die ersten zwei benachbarten Elemente, die gleich sind (oder ein gegebenes Prädikat erfüllen) (Algorithmus-Funktionsobjekt) |
(C++20)(C++20) |
gibt die Anzahl der Elemente zurück, die bestimmte Kriterien erfüllen (Algorithmus-Funktionsobjekt) |
(C++20) |
findet die erste Position, an der sich zwei Bereiche unterscheiden (Algorithmus-Funktionsobjekt) |
(C++20) |
bestimmt, ob zwei Mengen von Elementen gleich sind (Algorithmus-Funktionsobjekt) |
(C++20) |
sucht nach dem ersten Vorkommen einer Folge von Elementen (Algorithmus-Funktionsobjekt) |
(C++20) |
sucht nach dem ersten Vorkommen einer bestimmten Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++23) |
prüft, ob ein Bereich mit einem anderen Bereich beginnt (Algorithmus-Funktionsobjekt) |
(C++23) |
prüft, ob ein Bereich mit einem anderen Bereich endet (Algorithmus-Funktionsobjekt) |
Faltungsoperationen | |
(C++23) |
faltet einen Bereich von Elementen von links (Algorithmus-Funktionsobjekt) |
(C++23) |
faltet einen Bereich von Elementen von links unter Verwendung des ersten Elements als Anfangswert (Algorithmus-Funktionsobjekt) |
(C++23) |
faltet einen Bereich von Elementen von rechts (Algorithmus-Funktionsobjekt) |
(C++23) |
faltet einen Bereich von Elementen von rechts unter Verwendung des letzten Elements als Anfangswert (Algorithmus-Funktionsobjekt) |
(C++23) |
faltet einen Bereich von Elementen von links, und gibt ein pair (Iterator, Wert) (Algorithmus-Funktionsobjekt) |
| faltet einen Bereich von Elementen von links unter Verwendung des ersten Elements als Anfangswert, und gibt ein pair (Iterator, optional) (Algorithmus-Funktionsobjekt) | |
Modifizierende Sequenzoperationen
Definiert in Header
<algorithm> | |
Definiert in Namensbereich
std::ranges | |
Kopieroperationen | |
(C++20)(C++20) |
kopiert einen Elementbereich an einen neuen Ort (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert eine Anzahl von Elementen an einen neuen Ort (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert einen Elementbereich in umgekehrter Reihenfolge (Algorithmus-Funktionsobjekt) |
(C++20) |
verschiebt einen Elementbereich an einen neuen Ort (Algorithmus-Funktionsobjekt) |
(C++20) |
verschiebt einen Elementbereich an einen neuen Ort in umgekehrter Reihenfolge (Algorithmus-Funktionsobjekt) |
Swap-Operationen | |
(C++20) |
tauscht zwei Bereiche von Elementen (Algorithmus-Funktionsobjekt) |
Transformationsoperationen | |
(C++20) |
wendet eine Funktion auf einen Bereich von Elementen an (Algorithmus-Funktionsobjekt) |
(C++20)(C++20) |
ersetzt alle Werte, die bestimmte Kriterien erfüllen, durch einen anderen Wert (Algorithmus-Funktionsobjekt) |
(C++20)(C++20) |
kopiert einen Bereich und ersetzt Elemente, die bestimmte Kriterien erfüllen, durch einen anderen Wert (Algorithmus-Funktionsobjekt) |
Erzeugungsoperationen | |
(C++20) |
weist einem Bereich von Elementen einen bestimmten Wert zu (Algorithmus-Funktionsobjekt) |
(C++20) |
weist einer Anzahl von Elementen einen Wert zu (Algorithmus-Funktionsobjekt) |
(C++20) |
speichert das Ergebnis einer Funktion in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
speichert das Ergebnis von N Anwendungen einer Funktion (Algorithmus-Funktionsobjekt) |
Entfernungsoperationen | |
(C++20)(C++20) |
entfernt Elemente, die bestimmte Kriterien erfüllen (Algorithmus-Funktionsobjekt) |
(C++20)(C++20) |
kopiert einen Bereich von Elementen und lässt diejenigen aus, die bestimmte Kriterien erfüllen (Algorithmus-Funktionsobjekt) |
(C++20) |
entfernt aufeinanderfolgende doppelte Elemente in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
erzeugt eine Kopie eines Bereichs von Elementen, die keine aufeinanderfolgenden Duplikate enthält (Algorithmus-Funktionsobjekt) |
Operationen zur Änderung der Reihenfolge | |
(C++20) |
kehrt die Reihenfolge der Elemente in einem Bereich um (Algorithmus-Funktionsobjekt) |
(C++20) |
erstellt eine umgekehrte Kopie eines Bereichs (Algorithmus-Funktionsobjekt) |
(C++20) |
rotiert die Reihenfolge der Elemente in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert und rotiert einen Bereich von Elementen (Algorithmus-Funktionsobjekt) |
(C++23)(C++23) |
verschiebt Elemente in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
ordnet Elemente in einem Bereich zufällig um (Algorithmus-Funktionsobjekt) |
Stichprobenoperationen | |
(C++20) |
wählt N zufällige Elemente aus einer Sequenz aus (Algorithmus-Funktionsobjekt) |
Definiert in Header
<algorithm> | |
Definiert in Namensraum
std::ranges | |
Partitionierungsoperationen | |
(C++20) |
bestimmt, ob der Bereich durch das gegebene Prädikat partitioniert ist (Algorithmus-Funktionsobjekt) |
(C++20) |
teilt einen Bereich von Elementen in zwei Gruppen auf (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert einen Bereich und teilt die Elemente in zwei Gruppen auf (Algorithmus-Funktionsobjekt) |
(C++20) |
teilt Elemente in zwei Gruppen auf, wobei die relative Reihenfolge innerhalb jeder Gruppe erhalten bleibt (Algorithmus-Funktionsobjekt) |
(C++20) |
lokalisiert den Partitionierungspunkt eines partitionierten Bereichs (Algorithmus-Funktionsobjekt) |
Sortieroperationen | |
(C++20) |
prüft, ob ein Bereich sortiert ist (Algorithmus-Funktionsobjekt) |
(C++20) |
findet den größten sortierten Teilbereich (Algorithmus-Funktionsobjekt) |
(C++20) |
sortiert einen Bereich von Elementen (Algorithmus-Funktionsobjekt) |
(C++20) |
sortiert die ersten N Elemente eines Bereichs (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert und sortiert teilweise einen Bereich von Elementen (Algorithmus-Funktionsobjekt) |
(C++20) |
sortiert einen Bereich von Elementen unter Beibehaltung der relativen Reihenfolge äquivalenter Elemente (Algorithmus-Funktionsobjekt) |
(C++20) |
findet das N-te Element, wenn der Bereich sortiert wäre (Algorithmus-Funktionsobjekt) |
Binäre Suchoperationen (auf sortierten Bereichen) | |
(C++20) |
findet das erste Element, das nicht kleiner als der gegebene Wert ist, mittels binärer Suche (Algorithmus-Funktionsobjekt) |
(C++20) |
findet das erste Element, das größer als der gegebene Wert ist, mittels binärer Suche (Algorithmus-Funktionsobjekt) |
(C++20) |
bestimmt, ob ein Element in einem Bereich existiert, mittels binärer Suche (Algorithmus-Funktionsobjekt) |
(C++20) |
findet den Bereich von Elementen, die dem gegebenen Wert entsprechen, mittels binärer Suche (Algorithmus-Funktionsobjekt) |
Mengenoperationen (auf sortierten Bereichen) | |
(C++20) |
ermittelt, ob eine Sequenz eine Untersequenz einer anderen ist (Algorithmus-Funktionsobjekt) |
(C++20) |
berechnet die Differenz zwischen zwei Mengen (Algorithmus-Funktionsobjekt) |
(C++20) |
berechnet die Schnittmenge zweier Mengen (Algorithmus-Funktionsobjekt) |
| berechnet die symmetrische Differenz zwischen zwei Mengen (Algorithmus-Funktionsobjekt) | |
(C++20) |
berechnet die Vereinigungsmenge zweier Mengen (Algorithmus-Funktionsobjekt) |
Merge-Operationen (auf sortierten Bereichen) | |
(C++20) |
führt zwei sortierte Bereiche zusammen (Algorithmus-Funktionsobjekt) |
(C++20) |
führt zwei geordnete Bereiche direkt zusammen (Algorithmus-Funktionsobjekt) |
Heap-Operationen | |
(C++20) |
prüft, ob der angegebene Bereich ein Max-Heap ist (Algorithmus-Funktionsobjekt) |
(C++20) |
findet den größten Teilbereich, der ein Max-Heap ist (Algorithmus-Funktionsobjekt) |
(C++20) |
erstellt einen Max-Heap aus einem Elementbereich (Algorithmus-Funktionsobjekt) |
(C++20) |
fügt einem Max-Heap ein Element hinzu (Algorithmus-Funktionsobjekt) |
(C++20) |
entfernt das größte Element aus einem Max-Heap (Algorithmus-Funktionsobjekt) |
(C++20) |
wandelt einen Max-Heap in einen sortierten Elementbereich um (Algorithmus-Funktionsobjekt) |
Minimum-/Maximum-Operationen |
|
|
(C++20)
|
gibt den größeren der gegebenen Werte zurück
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt das größte Element in einem Bereich zurück
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt den kleineren der gegebenen Werte zurück
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt das kleinste Element in einem Bereich zurück
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt das kleinere und größere von zwei Elementen zurück
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt die kleinsten und größten Elemente in einem Bereich zurück
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
begrenzt einen Wert auf einen Bereich zwischen zwei Grenzwerten
(Algorithmus-Funktionsobjekt) |
Lexikografische Vergleichsoperationen | |
| vergleicht zwei Bereiche lexikografisch (Algorithmus-Funktionsobjekt) | |
Permutationsoperationen |
|
|
(C++20)
|
bestimmt, ob eine Sequenz eine Permutation einer anderen Sequenz ist
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
erzeugt die nächstgrößere lexikografische Permutation eines Elementebereichs
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
erzeugt die nächstkleinere lexikografische Permutation eines Elementebereichs
(Algorithmus-Funktionsobjekt) |
Numerische Operationen
Definiert in Header
<numeric> | |
Definiert in namespace
std::ranges | |
(C++23) |
füllt einen Bereich mit sukzessiven Inkrementen des Startwerts (Algorithmus-Funktionsobjekt) |
Spezialisierte <memory> Algorithmen
Definiert in Header
<memory> | |
Definiert in Namensraum
std::ranges | |
Objekt-(Stapel-)Konstruktion | |
(C++20) |
erzeugt ein Objekt an einer gegebenen Adresse (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert einen Bereich von Objekten in einen nicht initialisierten Speicherbereich (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert eine Anzahl von Objekten in einen nicht initialisierten Speicherbereich (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert ein Objekt in einen nicht initialisierten Speicherbereich, definiert durch einen Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
kopiert ein Objekt in einen nicht initialisierten Speicherbereich, definiert durch einen Start und eine Anzahl (Algorithmus-Funktionsobjekt) |
(C++20) |
verschiebt einen Bereich von Objekten in einen nicht initialisierten Speicherbereich (Algorithmus-Funktionsobjekt) |
(C++20) |
verschiebt eine Anzahl von Objekten in einen nicht initialisierten Speicherbereich (Algorithmus-Funktionsobjekt) |
| erzeugt Objekte durch Default-Initialisierung in einem nicht initialisierten Speicherbereich, definiert durch einen Bereich (Algorithmus-Funktionsobjekt) | |
| erzeugt Objekte durch Default-Initialisierung in einem nicht initialisierten Speicherbereich, definiert durch einen Start und eine Anzahl (Algorithmus-Funktionsobjekt) | |
| erzeugt Objekte durch Wertinitialisierung in einem nicht initialisierten Speicherbereich, definiert durch einen Bereich (Algorithmus-Funktionsobjekt) | |
| erzeugt Objekte durch Wertinitialisierung in einem nicht initialisierten Speicherbereich, definiert durch einen Start und eine Anzahl (Algorithmus-Funktionsobjekt) | |
Objekt (Batch-)Zerstörung | |
(C++20) |
zerstört einen Bereich von Objekten (Algorithmus-Funktionsobjekt) |
(C++20) |
zerstört eine Anzahl von Objekten in einem Bereich (Algorithmus-Funktionsobjekt) |
(C++20) |
zerstört ein Objekt an einer gegebenen Adresse (Algorithmus-Funktionsobjekt) |
Spezialisierte <random> Algorithmen
Definiert in Header
<random> | |
Definiert im Namensraum
std::ranges | |
(C++26) |
füllt einen Bereich mit Zufallszahlen aus einem gleichmäßigen Zufallsbitgenerator (Algorithmus-Funktionsobjekt) |
Rückgabetypen
|
Definiert in Header
<algorithm>
|
|
|
Definiert in Namespace
std::ranges
|
|
|
(C++20)
|
bietet eine Möglichkeit, einen Iterator und ein Funktionsobjekt als eine Einheit zu speichern
(Klassentemplate) |
|
(C++20)
|
bietet eine Möglichkeit, zwei Iteratoren als eine Einheit zu speichern
(Klassentemplate) |
|
(C++20)
|
bietet eine Möglichkeit, zwei Iteratoren als eine Einheit zu speichern
(Klassentemplate) |
|
(C++20)
|
bietet eine Möglichkeit, drei Iteratoren als eine Einheit zu speichern
(Klassentemplate) |
|
(C++20)
|
bietet eine Möglichkeit, drei Iteratoren als eine Einheit zu speichern
(Klassentemplate) |
|
(C++20)
|
bietet eine Möglichkeit, zwei Objekte oder Referenzen desselben Typs als eine Einheit zu speichern
(Klassentemplate) |
|
(C++20)
|
bietet eine Möglichkeit, einen Iterator und ein boolesches Flag als eine Einheit zu speichern
(Klassentemplate) |
|
(C++23)
|
bietet eine Möglichkeit, einen Iterator und einen Wert als eine Einheit zu speichern
(Klassentemplate) |
|
(C++23)
|
bietet eine Möglichkeit, einen Iterator und einen Wert als eine Einheit zu speichern
(Klassentemplate) |
Anmerkungen
| Feature-Test Makro | Wert | Standard | Merkmal |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403L |
(C++26) | Listeninitialisierung für Algorithmen |
__cpp_lib_parallel_algorithm |
202506L |
(C++26) | Parallele Bereichsalgorithmen |
__cpp_lib_ranges |
201911L |
(C++20) | Ranges-Bibliothek und eingeschränkte Algorithmen |
__cpp_lib_ranges_contains |
202207L |
(C++23) | std::ranges::contains |
__cpp_lib_ranges_find_last |
202207L |
(C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold |
202207L |
(C++23) | std::ranges Fold-Algorithmen
|
__cpp_lib_ranges_iota |
202202L |
(C++23) | std::ranges::iota |
__cpp_lib_ranges_starts_ends_with |
202106L |
(C++23) | std::ranges::starts_with, std::ranges::ends_with |
__cpp_lib_shift |
201806L |
(C++20) | std::shift_left, std::shift_right |
202202L |
(C++23) | std::ranges::shift_left, std::ranges::shift_right | |
__cpp_lib_ranges_generate_random |
202403L |
(C++26) | std::ranges::generate_random |
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Richtiges Verhalten |
|---|---|---|---|
| P3136R1 | C++20 | niebloids durften als spezielle Entitäten außer Funktionsobjekten spezifiziert werden |
müssen als Funktionsobjekte spezifiziert werden |