std::partition_copy
| 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) |
[first, last) in zwei verschiedene Bereiche, abhängig vom Wert, den das Prädikat p zurückgibt.
- Die Elemente, die das Prädikat
perfüllen, werden in den Bereich kopiert, der beid_first_truebeginnt. - Die restlichen Elemente werden in den Bereich kopiert, der bei
d_first_falsebeginnt.
policy ausgeführt.true ist:
|
|
(bis C++20) |
|
|
(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 |
| 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
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist 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) | |
(C++20) |
|
| teilt Elemente in zwei Gruppen unter Beibehaltung ihrer relativen Reihenfolge innerhalb jeder Gruppe auf (Funktionsvorlage & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
(C++11) |
kopiert einen Bereich von Elementen an einen neuen Speicherort (Funktionsvorlage & Algorithmus-Funktionsobjekt) |
(C++20)(C++20) |
|
| kopiert einen Bereich von Elementen unter Auslassung derer, die bestimmte Kriterien erfüllen (Funktionsvorlage & Algorithmus-Funktionsobjekt) | |
(C++20)(C++20) |
|
(C++20) |
kopiert einen Bereich unter Aufteilung der Elemente in zwei Gruppen (Algorithmus-Funktionsobjekt) |