std:: stable_sort
|
Definiert in Header
<algorithm>
|
||
|
template
<
class
RandomIt
>
void stable_sort ( RandomIt first, RandomIt last ) ; |
(1) | (constexpr seit C++26) |
|
template
<
class
ExecutionPolicy,
class
RandomIt
>
void
stable_sort
(
ExecutionPolicy
&&
policy,
|
(2) | (seit C++17) |
|
template
<
class
RandomIt,
class
Compare
>
void stable_sort ( RandomIt first, RandomIt last, Compare comp ) ; |
(3) | (constexpr seit C++26) |
|
template
<
class
ExecutionPolicy,
class
RandomIt,
class
Compare
>
void
stable_sort
(
ExecutionPolicy
&&
policy,
|
(4) | (seit C++17) |
Sortiert die Elemente im Bereich
[
first
,
last
)
in nicht-absteigender Reihenfolge. Die Reihenfolge äquivalenter Elemente bleibt garantiert erhalten.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> ist true . |
(bis C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> ist true . |
(seit C++20) |
Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
|
(bis C++11) |
|
(seit C++11) |
Inhaltsverzeichnis |
Parameter
| first, last | - | das Paar von Iteratoren, das den Bereich der zu sortierenden Elemente definiert |
| policy | - | die zu verwendende Ausführungsrichtlinie |
| comp | - |
Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von
Compare
erfüllt), das
true
zurückgibt, wenn das erste Argument
kleiner
als (d.h. vor dem zweiten
geordnet
ist) das zweite ist.
Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein: bool cmp ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur keine
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte des Typs (möglicherweise const)
|
| Typanforderungen | ||
-
RandomIt
muss die Anforderungen von
LegacyRandomAccessIterator
erfüllen.
|
||
-
Compare
muss die Anforderungen von
Compare
erfüllen.
|
||
Komplexität
Gegeben N als last - first :
(N)) Vergleiche.
(N)) Anwendungen.
Ausnahmen
Die Überladungen mit einem Template-Parameter namens
ExecutionPolicy
melden Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.
Mögliche Implementierung
Siehe auch die Implementierungen in libstdc++ und libc++ .
Hinweise
Diese Funktion versucht, einen temporären Puffer in der Größe der zu sortierenden Sequenz zu reservieren. Wenn die Reservierung fehlschlägt, wird der weniger effiziente Algorithmus gewählt.
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_constexpr_algorithms
|
202306L
|
(C++26) | constexpr stabile Sortierung, Überladungen ( 1 ) , ( 3 ) |
Beispiel
#include <algorithm> #include <array> #include <iostream> #include <string> #include <vector> struct Employee { int age; std::string name; // Nimmt nicht an Vergleichen teil }; bool operator<(const Employee& lhs, const Employee& rhs) { return lhs.age < rhs.age; } #if __cpp_lib_constexpr_algorithms >= 202306L consteval auto get_sorted() { auto v = std::array{3, 1, 4, 1, 5, 9}; std::stable_sort(v.begin(), v.end()); return v; } static_assert(std::ranges::is_sorted(get_sorted())); #endif int main() { std::vector<Employee> v{{108, "Zaphod"}, {32, "Arthur"}, {108, "Ford"}}; std::stable_sort(v.begin(), v.end()); for (const Employee& e : v) std::cout << e.age << ", " << e.name << '\n'; }
Ausgabe:
32, Arthur 108, Zaphod 108, Ford
Siehe auch
|
sortiert einen Bereich in aufsteigender Reihenfolge
(Funktionstemplate) |
|
|
sortiert die ersten N Elemente eines Bereichs
(Funktionstemplate) |
|
|
teilt Elemente in zwei Gruppen unter Beibehaltung ihrer relativen Reihenfolge
(Funktionstemplate) |
|
|
(C++20)
|
sortiert einen Elementbereich unter Beibehaltung der Reihenfolge zwischen gleichen Elementen
(Algorithmus-Funktionsobjekt) |