Namensräume
Varianten
Aktionen

std::stable_partition

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)  
stable_partition
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
template< class BidirIt, class UnaryPred >
BidirIt stable_partition( BidirIt first, BidirIt last, UnaryPred p );
(1) (constexpr seit C++26)
template< class ExecutionPolicy, class BidirIt, class UnaryPred >

BidirIt stable_partition( ExecutionPolicy&& policy,

                          BidirIt first, BidirIt last, UnaryPred p );
(2) (seit C++17)
1) Ordnet die Elemente im Bereich [firstlast) so um, dass alle Elemente, für die der Prädikat p true zurückgibt, vor den Elementen stehen, für die das Prädikat p false zurückgibt. Die relative Reihenfolge der Elemente wird beibehalten.
2) Wie (1), wird aber gemäß policy ausgeführt.
Diese Überladung nimmt an der Überladungsauflösung teil, nur wenn alle folgenden Bedingungen erfüllt sind

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)

Inhalt

[edit] Parameter

first, last - Das Iteratorenpaar, das den Bereich der neu zu ordnenden Elemente definiert
policy - die Ausführungsrichtlinie, die verwendet werden soll
p - unäres Prädikat, das ​true zurückgibt, wenn das Element vor anderen Elementen geordnet werden soll.

Der Ausdruck p(v) muss für jedes Argument v vom Typ (möglicherweise const) VT, wobei VT der Werttyp von BidirIt ist, unabhängig von der Wertkategorie, in bool konvertierbar sein und darf v nicht verändern. Daher ist ein Parametertyp von VT&nicht erlaubt, ebenso wenig wie VT, es sei denn, für VT ist eine Verschiebung gleichbedeutend mit einer Kopie(seit C++11). ​

Typanforderungen
-
BidirIt muss die Anforderungen von LegacyBidirectionalIterator erfüllen.
-
UnaryPred muss die Anforderungen von Predicate erfüllen.

[edit] Rückgabewert

Iterator auf das erste Element der zweiten Gruppe.

[edit] Komplexität

Gegeben sei N als std::distance(first, last).

1) Genau N Anwendungen von p.
O(N) Vertauschungen, wenn genügend zusätzlicher Speicher vorhanden ist, andernfalls höchstens N⋅log2(N) Vertauschungen.
2) O(N) Anwendungen von p.
N⋅log(N) Vertauschungen.

[edit] Ausnahmen

Die Überladung mit einem Template-Parameter namens ExecutionPolicy meldet Fehler wie folgt

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[edit] Hinweise

Diese Funktion versucht, einen temporären Puffer zu allokieren. Schlägt die Allokation fehl, wird der weniger effiziente Algorithmus gewählt.

Implementierungen in libc++ und libstdc++ akzeptieren auch Bereiche, die von LegacyForwardIteratoren bezeichnet werden, als Erweiterung.

Feature-Test-Makro Wert Std Feature
__cpp_lib_constexpr_algorithms 202306L (C++26) constexpr stabile Sortierung (1)

[edit] Beispiel

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v{0, 0, 3, -1, 2, 4, 5, 0, 7};
    std::stable_partition(v.begin(), v.end(), [](int n) { return n > 0; });
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

Ausgabe

3 2 4 5 7 0 0 -1 0

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2150 C++98 std::stable_partition war nur dazu verpflichtet, ein
Element, das p erfüllt, vor ein Element zu stellen, das p nicht erfüllt
korrigierte die
Anforderung

[edit] Siehe auch

Teilt einen Bereich von Elementen in zwei Gruppen auf
(Funktionstemplate) [edit]
Teilt Elemente in zwei Gruppen auf und behält dabei ihre relative Reihenfolge bei
(Algorithmus-Funktionsobjekt)[edit]