Eingeschränkte Algorithmen (seit C++20)
C++20 bietet eingeschränkte Versionen der meisten Algorithmen im Namespace std::ranges. In diesen Algorithmen kann ein Bereich entweder als Iterator-Sentinel-Paar oder als einzelnes range-Argument angegeben werden, und Projektionen und Zeiger-auf-Mitglied-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.
[bearbeiten] Algorithmus-Funktionsobjekte
Ein Algorithmus-Funktionsobjekt (AFO), umgangssprachlich auch Niebloid genannt, ist ein Customization Point Object (CPO), das als eine oder mehrere überladene Funktion-Templates spezifiziert ist. Der Name dieser Funktion-Templates bezeichnet das entsprechende Algorithmus-Funktionsobjekt.
Für ein Algorithmus-Funktionsobjekt o sei S die entsprechende Menge von Funktion-Templates. Dann ist für jede Sequenz von Argumenten args... o(args...) ausdrucksäquivalent zu s(args...), wobei das Ergebnis der Namensauflösung für s die Überladungsmenge S ist.
Die eingeschränkten Algorithmen im Namespace std::ranges sind als Algorithmus-Funktionsobjekte definiert. Infolgedessen
- Können explizite Template-Argumentlisten bei keinem von ihnen angegeben werden.
- Keiner von ihnen ist für Argument-abhängige Suche sichtbar.
- Wenn einer von ihnen durch normale unqualifizierte Suche als Name links vom Funktionsaufrufoperator gefunden wird, wird die Argument-abhängige Suche unterdrückt.
[bearbeiten] Eingeschränkte Algorithmen
| Definiert in Header
<algorithm> | |
| Definiert im Namespace
std::ranges | |
Nicht-modifizierende Sequenzoperationen | |
| (C++20)(C++20)(C++20) |
Prüft, ob eine Bedingung für alle, einige oder keine Elemente in einem Bereich wahr 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 Elementmengen gleich sind (Algorithmus-Funktionsobjekt) |
| gibt true zurück, wenn 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 der Elemente aus einer Menge von Elementen (Algorithmus-Funktionsobjekt) |
| (C++20) |
Findet die ersten beiden benachbarten Elemente, die gleich sind (oder eine gegebene Bedingung erfüllen) (Algorithmus-Funktionsobjekt) |
| (C++20) |
Sucht 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 einen Elementbereich 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 Elementbereich an einen neuen Speicherort (Algorithmus-Funktionsobjekt) |
| (C++20) |
Verschiebt einen Elementbereich in umgekehrter Reihenfolge an einen neuen Speicherort (Algorithmus-Funktionsobjekt) |
| (C++20) |
Weist einem Elementbereich 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 Elementbereich an (Algorithmus-Funktionsobjekt) |
| (C++20) |
Speichert das Ergebnis einer Funktion in einem Bereich (Algorithmus-Funktionsobjekt) |
| (C++20) |
Speichert das Ergebnis von N Funktionsanwendungen (Algorithmus-Funktionsobjekt) |
| (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)(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 (Algorithmus-Funktionsobjekt) |
| (C++20) |
Kehrt die Reihenfolge der Elemente in einem Bereich um (Algorithmus-Funktionsobjekt) |
| (C++20) |
Erstellt eine Kopie eines Bereichs, der umgekehrt ist (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++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) |
Stellt fest, 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 und behält dabei ihre relative Reihenfolge bei (Algorithmus-Funktionsobjekt) |
| (C++20) |
Findet den Partitionierungspunkt eines partitionierten Bereichs (Algorithmus-Funktionsobjekt) |
Sortieroperationen | |
| (C++20) |
Prüft, ob ein Bereich aufsteigend sortiert ist (Algorithmus-Funktionsobjekt) |
| (C++20) |
Findet den größten sortierten Teilbereich (Algorithmus-Funktionsobjekt) |
| (C++20) |
Sortiert einen Bereich aufsteigend (Algorithmus-Funktionsobjekt) |
| (C++20) |
Sortiert die ersten N Elemente eines Bereichs (Algorithmus-Funktionsobjekt) |
| (C++20) |
Kopiert und sortiert einen Bereich von Elementen teilweise (Algorithmus-Funktionsobjekt) |
| (C++20) |
Sortiert einen Bereich von Elementen und behält dabei die Reihenfolge zwischen gleichen Elementen bei (Algorithmus-Funktionsobjekt) |
| (C++20) |
Sortiert den gegebenen Bereich teilweise, so 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) |
Stellt fest, ob ein Element in einem teilweise geordneten Bereich vorhanden ist (Algorithmus-Funktionsobjekt) |
| (C++20) |
gibt den Bereich von Elementen zurück, die einem bestimmten Schlüssel entsprechen (Algorithmus-Funktionsobjekt) |
Mengenoperationen (auf sortierten Bereichen) | |
| (C++20) |
Führt zwei sortierte Bereiche zusammen (Algorithmus-Funktionsobjekt) |
| (C++20) |
Führt zwei sortierte Bereiche an Ort und Stelle zusammen (Algorithmus-Funktionsobjekt) |
| (C++20) |
Gibt true zurück, wenn eine Sequenz eine Untersequenz einer anderen ist (Algorithmus-Funktionsobjekt) |
| (C++20) |
Berechnet die Differenz zwischen zwei Mengen (Algorithmus-Funktionsobjekt) |
| (C++20) |
Berechnet den Schnitt zweier Mengen (Algorithmus-Funktionsobjekt) |
| Berechnet die symmetrische Differenz zwischen zwei Mengen (Algorithmus-Funktionsobjekt) | |
| (C++20) |
Berechnet die Vereinigung zweier Mengen (Algorithmus-Funktionsobjekt) |
Heapoperationen | |
| (C++20) |
Prüft, ob der gegebene Bereich ein Max-Heap ist (Algorithmus-Funktionsobjekt) |
| (C++20) |
Findet den größten Teilbereich, der ein Max-Heap ist (Algorithmus-Funktionsobjekt) |
| (C++20) |
Erstellt aus einem Bereich von Elementen einen Max-Heap (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) |
Verwandelt einen Max-Heap in einen aufsteigend sortierten Bereich von Elementen (Algorithmus-Funktionsobjekt) |
Minimum/Maximum-Operationen | |
| (C++20) |
Gibt den größeren der beiden 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 beiden Werte zurück (Algorithmus-Funktionsobjekt) |
| (C++20) |
gibt das kleinste Element in einem Bereich zurück (Algorithmus-Funktionsobjekt) |
| (C++20) |
gibt die kleinere und größere von zwei Elementen zurück (Algorithmus-Funktionsobjekt) |
| (C++20) |
gibt das kleinste und das größte Element in einem Bereich zurück (Algorithmus-Funktionsobjekt) |
| (C++20) |
klemmt einen Wert zwischen einem Paar von Grenzwerte (Algorithmus-Funktionsobjekt) |
Permutationsoperationen | |
| (C++20) |
bestimmt, ob eine Sequenz eine Permutation einer anderen Sequenz ist (Algorithmus-Funktionsobjekt) |
| (C++20) |
erzeugt die nächstgrößere lexikographische Permutation eines Bereichs von Elementen (Algorithmus-Funktionsobjekt) |
| (C++20) |
erzeugt die nächstkleinere lexikographische Permutation eines Bereichs von Elementen (Algorithmus-Funktionsobjekt) |
[bearbeiten] Eingeschränkte numerische Operationen
| Definiert in der Header-Datei
<numeric> | |
| Definiert im Namespace
std::ranges | |
| (C++23) |
füllt einen Bereich mit sukzessiven Inkrementen des Startwerts (Funktionsobjekt für Algorithmen) |
[bearbeiten] Eingeschränkte Faltoperationen
| Definiert in Header
<algorithm> | |
| Definiert im Namespace
std::ranges | |
| (C++23) |
Faltet einen Elementbereich von links (Algorithmus-Funktionsobjekt) |
| (C++23) |
Faltet einen Elementbereich von links unter Verwendung des ersten Elements als Anfangswert (Algorithmus-Funktionsobjekt) |
| (C++23) |
Faltet einen Elementbereich von rechts (Algorithmus-Funktionsobjekt) |
| (C++23) |
Faltet einen Elementbereich von rechts unter Verwendung des letzten Elements als Anfangswert (Algorithmus-Funktionsobjekt) |
| (C++23) |
Faltet einen Elementbereich von links und gibt ein Paar (Iterator, Wert) zurück (Algorithmus-Funktionsobjekt) |
| Faltet einen Elementbereich von links unter Verwendung des ersten Elements als Anfangswert und gibt ein Paar (Iterator, optional) zurück (Algorithmus-Funktionsobjekt) | |
[bearbeiten] Eingeschränkte Algorithmen für uninitialisierten Speicher
| Definiert in Header
<memory> | |
| Definiert im Namespace
std::ranges | |
| (C++20) |
kopiert einen Bereich von Objekten in einen uninitialisierten Speicherbereich (Algorithmus-Funktionsobjekt) |
| (C++20) |
kopiert eine Anzahl von Objekten in einen uninitialisierten Speicherbereich (Algorithmus-Funktionsobjekt) |
| (C++20) |
kopiert ein Objekt in einen uninitialisierten Speicherbereich, definiert durch einen Bereich (Algorithmus-Funktionsobjekt) |
| (C++20) |
kopiert ein Objekt in einen uninitialisierten Speicherbereich, definiert durch einen Start und eine Anzahl (Algorithmus-Funktionsobjekt) |
| (C++20) |
verschiebt einen Bereich von Objekten in einen uninitialisierten Speicherbereich (Algorithmus-Funktionsobjekt) |
| (C++20) |
verschiebt eine Anzahl von Objekten in einen uninitialisierten Speicherbereich (Algorithmus-Funktionsobjekt) |
| konstruiert Objekte mittels Standardinitialisierung in einem uninitialisierten Speicherbereich, definiert durch einen Bereich (Algorithmus-Funktionsobjekt) | |
| konstruiert Objekte mittels Standardinitialisierung in einem uninitialisierten Speicherbereich, definiert durch Start und Anzahl (Algorithmus-Funktionsobjekt) | |
| konstruiert Objekte mittels Wertinitialisierung in einem uninitialisierten Speicherbereich, definiert durch einen Bereich (Algorithmus-Funktionsobjekt) | |
| konstruiert Objekte mittels Wertinitialisierung in einem uninitialisierten Speicherbereich, definiert durch einen Start und eine Anzahl (Algorithmus-Funktionsobjekt) | |
| (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) |
| (C++20) |
erstellt ein Objekt an einer gegebenen Adresse (Algorithmus-Funktionsobjekt) |
[bearbeiten] Eingeschränkte Zufallszahl-Algorithmen
| Definiert in Header
<random> | |
| Definiert im Namespace
std::ranges | |
| (C++26) |
füllt einen Bereich mit Zufallszahlen aus einem gleichmäßigen Zufalls-Bit-Generator (Algorithmus-Funktionsobjekt) |
[bearbeiten] Rückgabetypen
| Definiert in Header
<algorithm> | |
| Definiert im Namespace
std::ranges | |
| (C++20) |
bietet eine Möglichkeit, einen Iterator und ein Funktionsobjekt als eine Einheit zu speichern (Klassenvorlage) |
| (C++20) |
bietet eine Möglichkeit, zwei Iteratoren als eine Einheit zu speichern (Klassenvorlage) |
| (C++20) |
bietet eine Möglichkeit, zwei Iteratoren als eine Einheit zu speichern (Klassenvorlage) |
| (C++20) |
bietet eine Möglichkeit, drei Iteratoren als eine Einheit zu speichern (Klassenvorlage) |
| (C++20) |
bietet eine Möglichkeit, drei Iteratoren als eine Einheit zu speichern (Klassenvorlage) |
| (C++20) |
bietet eine Möglichkeit, zwei Objekte oder Referenzen desselben Typs als eine Einheit zu speichern (Klassenvorlage) |
| (C++20) |
bietet eine Möglichkeit, einen Iterator und ein boolesches Flag als eine Einheit zu speichern (Klassenvorlage) |
| (C++23) |
bietet eine Möglichkeit, einen Iterator und einen Wert als eine Einheit zu speichern (Klassenvorlage) |
| (C++23) |
bietet eine Möglichkeit, einen Iterator und einen Wert als eine Einheit zu speichern (Klassenvorlage) |
[bearbeiten] Anmerkungen
| 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 Falt-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 |
[bearbeiten] Meldungen
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P3136R1 | C++20 | Niebloids durften als spezielle Entitäten spezifiziert werden anstatt als Funktionsobjekte |
mussten als Funktionsobjekte spezifiziert werden |