Namespaces
Variants

std::partition

Von de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Stapeloperationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum-/Maximumoperationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Definiert in Header <algorithm>
template< class ForwardIt, class UnaryPred >
ForwardIt partition( ForwardIt first, ForwardIt last, UnaryPred p );
(1) (constexpr seit C++20)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt partition( ExecutionPolicy&& policy, 
                     ForwardIt first, ForwardIt last, UnaryPred p );
(2) (seit C++17)
1) Ordnet die Elemente im Bereich [first, last) so neu an, dass alle Elemente, für die das Prädikat p true zurückgibt, allen Elementen vorangehen, für die das Prädikat p false zurückgibt. Die relative Reihenfolge der Elemente bleibt nicht erhalten.
2) Wie (1), jedoch gemäß policy ausgeführt.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn der Wert des folgenden Ausdrucks true ist:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(seit C++20)

Wenn der Typ von *first nicht Swappable(bis C++11)ForwardIt nicht ValueSwappable(seit C++11) ist, ist das Verhalten undefiniert.

Parameter

first, last - das Paar von Iteratoren, das den Bereich der umzuordnenden Elemente definiert
policy - die zu verwendende Ausführungsrichtlinie
p - unäres Prädikat, das ​ true zurückgibt, wenn das Element vor anderen Elementen angeordnet werden soll.

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

Typanforderungen
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.
-
UnaryPred muss die Anforderungen von Predicate erfüllen.

Rückgabewert

Iterator zum ersten Element der zweiten Gruppe.

Komplexität

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

1) Genau N Anwendungen von p .
Höchstens N/2 Vertauschungen, falls ForwardIt die Anforderungen von LegacyBidirectionalIterator erfüllt, andernfalls höchstens N Vertauschungen.
2) O(N) Anwendungen von p .
O(N·log(N)) Vertauschungen.

Ausnahmen

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

  • Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und ExecutionPolicy einer der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.

Mögliche Implementierung

Implementiert Überladung (1) unter Wahrung der C++11-Kompatibilität.

template<class ForwardIt, class UnaryPred>
ForwardIt partition(ForwardIt first, ForwardIt last, UnaryPred p)
{
    first = std::find_if_not(first, last, p);
    if (first == last)
        return first;
    for (auto i = std::next(first); i != last; ++i)
        if (p(*i))
        {
            std::iter_swap(i, first);
            ++first;
        }
    return first;
}
**Hinweis:** Da der gesamte Text innerhalb der `
`-Tags C++-Code ist und gemäß den Anweisungen nicht übersetzt werden darf, wurde nur die HTML-Struktur beibehalten. Der Code selbst bleibt unverändert auf Englisch, wie in den Anforderungen spezifiziert.

Beispiel

#include <algorithm>
#include <forward_list>
#include <iostream>
#include <iterator>
#include <vector>
template<class ForwardIt>
void quicksort(ForwardIt first, ForwardIt last)
{
    if (first == last)
        return;
    auto pivot = *std::next(first, std::distance(first, last) / 2);
    auto middle1 = std::partition(first, last, [pivot](const auto& em)
    {
        return em < pivot;
    });
    auto middle2 = std::partition(middle1, last, [pivot](const auto& em)
    {
        return !(pivot < em);
    });
    quicksort(first, middle1);
    quicksort(middle2, last);
}
int main()
{
    std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::cout << "Original vector: ";
    for (int elem : v)
        std::cout << elem << ' ';
    auto it = std::partition(v.begin(), v.end(), [](int i) {return i % 2 == 0;});
    std::cout << "\nPartitioned vector: ";
    std::copy(std::begin(v), it, std::ostream_iterator<int>(std::cout, " "));
    std::cout << "* ";
    std::copy(it, std::end(v), std::ostream_iterator<int>(std::cout, " "));
    std::forward_list<int> fl {1, 30, -4, 3, 5, -4, 1, 6, -8, 2, -5, 64, 1, 92};
    std::cout << "\nUnsorted list: ";
    for (int n : fl)
        std::cout << n << ' ';
    quicksort(std::begin(fl), std::end(fl));
    std::cout << "\nSorted using quicksort: ";
    for (int fi : fl)
        std::cout << fi << ' ';
    std::cout << '\n';
}

Mögliche Ausgabe:

Original vector: 0 1 2 3 4 5 6 7 8 9 
Partitioned vector: 0 8 2 6 4 * 5 3 7 1 9 
Unsorted list: 1 30 -4 3 5 -4 1 6 -8 2 -5 64 1 92 
Sorted using quicksort: -8 -5 -4 -4 1 1 1 2 3 5 6 30 64 92

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
LWG 498 C++98 std::partition erforderte first und
last als LegacyBidirectionalIterator
nur erforderlich als
LegacyForwardIterator
LWG 2150 C++98 std::partition musste nur ein Element
erfüllend p vor einem nicht erfüllenden Element platzieren p
korrigierte die
Anforderung

Siehe auch

bestimmt, ob der Bereich durch das gegebene Prädikat partitioniert ist
(Funktionsschablone & Algorithmus-Funktionsobjekt)
teilt Elemente in zwei Gruppen auf, während ihre relative Reihenfolge innerhalb jeder Gruppe erhalten bleibt
(Funktionsschablone & Algorithmus-Funktionsobjekt)
teilt einen Bereich von Elementen in zwei Gruppen auf
(Algorithmus-Funktionsobjekt)