Constrained algorithms (since C++20)
C++20 bietet
eingeschränkte
Versionen der meisten Algorithmen im Namensraum
std::ranges
. In diesen Algorithmen kann ein Bereich entweder als ein
Iterator
-
Sentinel
-Paar oder als ein einzelnes
range
-Argument angegeben werden, und Projektionen sowie Aufrufbare mit Zeiger-auf-Mitglied 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 bekannt als Niebloid , ist ein Customization Point Object (CPO), das als eine oder mehrere überladene Funktionsvorlagen spezifiziert ist. Der Name dieser Funktionsvorlagen bezeichnet das entsprechende Algorithmus-Funktionsobjekt.
Für ein Algorithmus-Funktionsobjekt
o
sei
S
die entsprechende Menge von Funktions-Templates. Dann gilt für jede Argumentfolge
args...
, dass
o
(
args...
)
ausdrucksäquivalent
zu
s
(
args...
)
ist, wobei das Ergebnis der Namenssuche für
s
der Überladungssatz
S
ist.
Die eingeschränkten Algorithmen im Namensraum
std::ranges
sind als Algorithmus-Funktionsobjekte definiert. Daraus folgt:
- Explizite Template-Argumentlisten können beim Aufruf keiner von ihnen angegeben werden.
- Keiner von ihnen ist sichtbar für argument-dependent lookup .
- Wenn einer von ihnen durch normal unqualified lookup als Name links vom Funktionsaufrufoperator gefunden wird, wird argument-dependent lookup unterdrückt.
Eingeschränkte Algorithmen
|
Definiert in Header
<algorithm>
|
|
|
Definiert im namespace
std::ranges
|
|
Nicht-modifizierende Sequenzoperationen |
|
|
(C++20)
(C++20)
(C++20)
|
prüft, ob ein Prädikat für
true
für alle, irgendeine oder keine Elemente in einem Bereich ist
(Algorithmus-Funktionsobjekt) |
|
(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) |
|
(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 Elementgruppen identisch sind
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt
true
zurück, falls ein Bereich lexikographisch kleiner als ein anderer ist
(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 Sequenz 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)
|
such nach dem ersten Vorkommen eines Elementbereichs
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
sucht nach dem ersten Vorkommen einer Anzahl aufeinanderfolgender Kopien eines Elements in einem Bereich
(Algorithmus-Funktionsobjekt) |
|
(C++23)
(C++23)
|
prüft, ob der Bereich das gegebene Element oder den gegebenen Teilbereich enthält
(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) |
Modifizierende Sequenzoperationen |
|
|
(C++20)
(C++20)
|
kopiert eine Reihe von Elementen an einen neuen Speicherort
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
kopiert eine Anzahl von Elementen an einen neuen Speicherort
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
kopiert einen Elementbereich in umgekehrter Reihenfolge
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
verschiebt einen Bereich von Elementen an einen neuen Speicherort
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
verschiebt einen Elementbereich rückwärts an eine neue Position
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
weist einer Reihe von Elementen einen bestimmten Wert zu
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
weist einer Anzahl von Elementen einen Wert zu
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
wendet eine Funktion auf einen Bereich von Elementen an
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
speichert das Ergebnis einer Funktion in einem Bereich
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
speichert das Ergebnis von N Aufrufen einer Funktion
(Algorithmus-Funktionsobjekt) |
|
(C++20)
(C++20)
|
Entfernt Elemente, die bestimmte Kriterien erfüllen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
(C++20)
|
kopiert einen Bereich von Elementen unter Auslassung derjenigen, die bestimmte Kriterien erfüllen
(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) |
|
(C++20)
|
tauscht zwei Elementbereiche aus
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
kehrt die Reihenfolge der Elemente in einem Bereich um
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
erstellt eine Kopie eines umgekehrten Bereichs
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
dreht die Reihenfolge der Elemente in einem Bereich
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
kopiert und rotiert einen Elementbereich
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
ordnet Elemente in einem Bereich zufällig neu an
(Algorithmus-Funktionsobjekt) |
|
verschiebt Elemente in einem Bereich
(Algorithmus-Funktionsobjekt) |
|
|
(C++20)
|
wählt N zufällige Elemente aus einer Sequenz aus
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
Entfernt aufeinanderfolgende doppelte Elemente in einem Bereich
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
erstellt eine Kopie eines Bereichs von Elementen, die keine aufeinanderfolgenden Duplikate enthält
(Algorithmus-Funktionsobjekt) |
Partitionierungsoperationen |
|
|
(C++20)
|
bestimmt, ob der Bereich durch das gegebene Prädikat partitioniert ist
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
unterteilt eine Reihe von Elementen in zwei Gruppen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
kopiert einen Bereich und unterteilt die Elemente in zwei Gruppen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
teilt Elemente in zwei Gruppen auf, während ihre relative Reihenfolge erhalten bleibt
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
ermittelt den Partitionierungspunkt eines partitionierten Bereichs
(Algorithmus-Funktionsobjekt) |
Sortieroperationen |
|
|
(C++20)
|
prüft, ob ein Bereich in aufsteigender Reihenfolge sortiert ist
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
findet den größten sortierten Teilbereich
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
sortiert einen Bereich in aufsteigender Reihenfolge
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
sortiert die ersten N Elemente eines Bereichs
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
kopiert und teilweise sortiert einen Bereich von Elementen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
sortiert eine Reihe von Elementen, während die Reihenfolge zwischen gleichen Elementen beibehalten wird
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
Sortiert den gegebenen Bereich teilweise und stellt sicher, dass er durch das gegebene Element partitioniert wird
(Algorithmus-Funktionsobjekt) |
Binäre Suchoperationen (auf sortierten Bereichen) |
|
|
(C++20)
|
gibt einen Iterator zum ersten Element zurück, das
nicht kleiner
als der gegebene Wert ist
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt einen Iterator zum ersten Element zurück,
das
größer
als ein bestimmter Wert ist
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
bestimmt, ob ein Element in einem teilweise geordneten Bereich existiert
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt den Bereich der Elemente zurück, die einem bestimmten Schlüssel entsprechen
(Algorithmus-Funktionsobjekt) |
Mengenoperationen (auf sortierten Bereichen) |
|
|
(C++20)
|
fasst zwei sortierte Bereiche zusammen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
verbindet zwei geordnete Bereiche direkt
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
gibt
true
zurück, falls eine Sequenz eine Teilsequenz einer anderen ist
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
berechnet die Differenz zwischen zwei Mengen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
berechnet die Schnittmenge zweier Mengen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
berechnet die symmetrische Differenz zwischen zwei Mengen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
berechnet die Vereinigung zweier Mengen
(Algorithmus-Funktionsobjekt) |
Heap-Operationen |
|
|
(C++20)
|
prüft, ob der gegebene Bereich ein Max-Heap ist
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
findet den größten Teilbereich, der einen Max-Heap darstellt
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
erstellt einen Max-Heap aus einer Reihe von Elementen
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
fügt ein Element zu einem Max-Heap hinzu
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
entfernt das größte Element aus einem Max-Heap
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
wandelt einen Max-Heap in einen Bereich von Elementen um, die in aufsteigender Reihenfolge sortiert sind
(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) |
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) |
Eingeschränkte numerische Operationen
|
Definiert in Header
<numeric>
|
|
|
Definiert in Namespace
std::ranges
|
|
|
(C++23)
|
füllt einen Bereich mit sukzessiven Inkrementen des Startwerts
(Algorithmus-Funktionsobjekt) |
Eingeschränkte Faltoperationen
|
Definiert in Header
<algorithm>
|
|
|
Definiert in Namespace
std::ranges
|
|
|
(C++23)
|
faltet eine Elementbereich von links
(Algorithmus-Funktionsobjekt) |
|
(C++23)
|
faltet eine Elementbereich von links unter Verwendung des ersten Elements als Anfangswert
(Algorithmus-Funktionsobjekt) |
|
(C++23)
|
faltet eine Elementbereich von rechts
(Algorithmus-Funktionsobjekt) |
|
(C++23)
|
faltet eine Elementbereich von rechts unter Verwendung des letzten Elements als Anfangswert
(Algorithmus-Funktionsobjekt) |
|
(C++23)
|
faltet eine Elementbereich von links und gibt ein
Paar
(Iterator, Wert) zurück
(Algorithmus-Funktionsobjekt) |
|
faltet eine Elementbereich von links unter Verwendung des ersten Elements als Anfangswert und gibt ein
Paar
(Iterator,
optional
) zurück
(Algorithmus-Funktionsobjekt) |
|
Eingeschränkte Algorithmen für nicht initialisierten Speicher
|
Definiert im Header
<memory>
|
|
|
Definiert im Namensbereich
std::ranges
|
|
|
(C++20)
|
kopiert einen Objektbereich 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 Objektbereich in einen nicht initialisierten Speicherbereich
(Algorithmus-Funktionsobjekt) |
|
(C++20)
|
verschiebt eine Anzahl von Objekten in einen nicht initialisierten Speicherbereich
(Algorithmus-Funktionsobjekt) |
|
konstruiert Objekte durch
Default-Initialisierung
in einem nicht initialisierten Speicherbereich, definiert durch einen Bereich
(Algorithmus-Funktionsobjekt) |
|
|
konstruiert Objekte durch
Default-Initialisierung
in einem nicht initialisierten Speicherbereich, definiert durch einen Start und eine Anzahl
(Algorithmus-Funktionsobjekt) |
|
|
konstruiert Objekte durch
Wert-Initialisierung
in einem nicht initialisierten Speicherbereich, definiert durch einen Bereich
(Algorithmus-Funktionsobjekt) |
|
|
konstruiert Objekte durch
Wert-Initialisierung
in einem nicht initialisierten Speicherbereich, definiert durch einen Start und eine Anzahl
(Algorithmus-Funktionsobjekt) |
|
|
(C++20)
|
zerstört einen Objektbereich
(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) |
|
(C++20)
|
erstellt ein Objekt an einer gegebenen Adresse
(Algorithmus-Funktionsobjekt) |
Eingeschränkte Zufallszahlen-Algorithmen
|
Definiert in Header
<random>
|
|
|
Definiert in Namespace
std::ranges
|
|
|
(C++26)
|
füllt einen Bereich mit Zufallszahlen von einem uniform random bit generator
(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) |
Hinweise
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type
|
202403L
|
(C++26) | Listeninitialisierung für Algorithmen |
__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 | Korrektes Verhalten |
|---|---|---|---|
| P3136R1 | C++20 |
Niebloids durften als spezielle Entitäten
außer Funktionsobjekten spezifiziert werden |
müssen als Funktionsobjekte spezifiziert werden |