Namespaces
Variants

std::partition_copy

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)
Vertauschungsoperationen
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)
Haufenoperationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
Definiert im Header <algorithm>
template< class InputIt, class OutputIt1,
          class OutputIt2, class UnaryPred >
std::pair<OutputIt1, OutputIt2>
    partition_copy( InputIt first, InputIt last,
                    OutputIt1 d_first_true, OutputIt2 d_first_false,
                    UnaryPred p );
(1) (seit C++11)
(constexpr seit C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2,
          class ForwardIt3, class UnaryPred >
std::pair<ForwardIt2, ForwardIt3>
    partition_copy( ExecutionPolicy&& policy,
                    ForwardIt1 first, ForwardIt1 last,
                    ForwardIt2 d_first_true, ForwardIt3 d_first_false,
                    UnaryPred p );
(2) (seit C++17)
1) Kopiert die Elemente aus dem Bereich [first, last) in zwei verschiedene Bereiche, abhängig vom Wert, den das Prädikat p zurückgibt.
  • Die Elemente, die das Prädikat p erfüllen, werden in den Bereich kopiert, der bei d_first_true beginnt.
  • Die restlichen Elemente werden in den Bereich kopiert, der bei d_first_false beginnt.
2) Wie (1), aber 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 *first nicht beschreibbar in d_first_true oder d_first_false ist, ist das Programm fehlerhaft.

Wenn sich zwei der Bereiche (der Eingabebereich und die beiden Ausgabebereiche) überschneiden, ist das Verhalten undefiniert.

Parameter

first, last - das Paar von Iteratoren, die den Quellbereich der zu kopierenden Elemente definieren
d_first_true - der Beginn des Ausgabebereichs für die Elemente, die p
erfüllend_first_false - der Beginn des Ausgabebereichs für die Elemente, die p
nicht erfüllenpolicy - die Ausführungsrichtlinie, die verwendet werden soll
p - unäres Prädikat, das ​true zurückgibt, wenn das Element in d_first_true platziert werden soll.

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

Typanforderungen
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.
-
OutputIt1, OutputIt2 muss die Anforderungen von LegacyOutputIterator erfüllen.
-
ForwardIt1, ForwardIt2, ForwardIt3 muss die Anforderungen von LegacyForwardIterator erfüllen.
-
UnaryPred muss die Anforderungen von Predicate erfüllen.

Rückgabewert

Ein std::pair, konstruiert aus dem Iterator zum Ende des d_first_true-Bereichs und dem Iterator zum Ende des d_first_false-Bereichs.

Komplexität

Genau std::distance(first, last) Anwendungen von p.

Bei der Überladung (2) kann es zu Leistungseinbußen kommen, wenn der Werttyp von ForwardIt nicht CopyConstructible ist.

Ausnahmen

Die Überladung mit einem Vorlagenparameter namens ExecutionPolicy meldet Fehler wie folgt:

  • Wenn die Ausführung einer im Rahmen des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.

Mögliche Implementierung

partition_copy (1)
template<class InputIt, class OutputIt1,
         class OutputIt2, class UnaryPred>
constexpr //< since C++20
std::pair<OutputIt1, OutputIt2>
    partition_copy(InputIt first, InputIt last,
                   OutputIt1 d_first_true, OutputIt2 d_first_false,
                   UnaryPred p)
{
    for (; first != last; ++first)
    {
        if (p(*first))
        {
            *d_first_true = *first;
            ++d_first_true;
        }
        else
        {
            *d_first_false = *first;
            ++d_first_false;
        }
    }
    
    return std::pair<OutputIt1, OutputIt2>(d_first_true, d_first_false);
}

Beispiel

#include <algorithm>
#include <iostream>
#include <utility>

void print(auto rem, const auto& v)
{
    for (std::cout << rem; const auto& x : v)
        std::cout << x << ' ';
    std::cout << '\n';
}

int main()
{
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int true_arr[5] = {0};
    int false_arr[5] = {0};
    
    std::partition_copy(std::begin(arr), std::end(arr),
                        std::begin(true_arr), std::begin(false_arr),
                        [](int i) { return 4 < i; });
    
    print("true_arr:  ", true_arr);
    print("false_arr: ", false_arr);
}

Ausgabe:

true_arr:  5 6 7 8 9
false_arr: 0 1 2 3 4

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
P0896R4 C++11
C++17
1. der Werttyp von InputIt (C++11)/ForwardIt1 (C++17)
    musste CopyAssignable
sein2. die beiden Ausgabebereiche konnten sich überschneiden
1. nicht erforderlich
2. das Verhalten ist in diesem Fall
    undefiniert

Siehe auch

teilt einen Bereich von Elementen in zwei Gruppen auf
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
teilt Elemente in zwei Gruppen unter Beibehaltung ihrer relativen Reihenfolge innerhalb jeder Gruppe auf
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
kopiert einen Bereich von Elementen an einen neuen Speicherort
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
kopiert einen Bereich von Elementen unter Auslassung derer, die bestimmte Kriterien erfüllen
(Funktionsvorlage & Algorithmus-Funktionsobjekt)
kopiert einen Bereich unter Aufteilung der Elemente in zwei Gruppen
(Algorithmus-Funktionsobjekt)