Namensräume
Varianten
Aktionen

std::partition_copy

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
partition_copy
(C++11)  
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 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 Rückgabewert des Prädikats p.
  • 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), 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 *first nicht in d_first_true oder d_first_false schreibbar ist, ist das Programm schlecht geformt.

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

Inhalt

[edit] Parameter

first, last - das Paar von Iteratoren, das den Quell-Bereich der zu kopierenden Elemente definiert
d_first_true - der Anfang des Ausgabebereichs für die Elemente, die p erfüllen
d_first_false - der Anfang des Ausgabebereichs für die Elemente, die p nicht erfüllen
policy - die Ausführungsrichtlinie, die verwendet werden soll
p - unäres Prädikat, das ​true zurückgibt, wenn das Element nach d_first_true kopiert werden soll.

Der Ausdruck p(v) muss konvertierbar zu bool sein für jedes Argument v vom Typ (möglicherweise const) VT, wobei VT der Werttyp von InputIt ist, unabhängig von der Wertkategorie, 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 ein Move äquivalent zu einem Copy(seit C++11). ​

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

[edit] 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.

[edit] Komplexität

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

Für die Überladung (2) kann es zu einem Performance-Kosten kommen, wenn der Werttyp von ForwardIt nicht CopyConstructible ist.

[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] 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);
}

[edit] 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

[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
P0896R4 C++11
C++17
1. Der Werttyp von InputIt (C++11)/ForwardIt1 (C++17)
    musste CopyAssignable sein
2. Die beiden Ausgabebereiche könnten sich überschnitten haben
1. Nicht erforderlich
2. Das Verhalten ist
    in diesem Fall undefiniert

[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
(Funktionstemplate) [edit]
Kopiert einen Elementbereich an einen neuen Speicherort
(Funktionstempelat) [edit]
Kopiert einen Bereich von Elementen und lässt diejenigen aus, die bestimmte Kriterien erfüllen
(Funktionstemplate) [edit]
Kopiert einen Bereich und teilt die Elemente in zwei Gruppen auf
(Algorithmus-Funktionsobjekt)[edit]