std::partition_copy
| Défini dans l'en-tête <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) | (depuis C++11) (constexpr depuis 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) | (depuis C++17) |
[first, last) vers deux vues différentes selon la valeur retournée par le prédicat p.
- Les éléments qui satisfont le prédicat
psont copiés dans la vue commençant àd_first_true. - Les autres éléments sont copiés dans la vue commençant à
d_first_false.
policy.true:
|
|
(jusqu'à C++20) |
|
|
(depuis C++20) |
Si *first n'est pas inscriptible dans d_first_true ou d_first_false, le programme est mal formé.
Parmi la vue d'entrée et les deux vues de sortie, si deux vues quelconques se chevauchent, le comportement est indéfini.
Paramètres
| first, last | - | la paire d'itérateurs définissant la vue source des éléments à copier |
| d_first_true | - | le début de la vue de sortie pour les éléments qui satisfont p
|
| d_first_false | - | le début de la vue de sortie pour les éléments qui ne satisfont pas p
|
| policy | - | la politique d'exécution à utiliser |
| p | - | prédicat unaire qui retourne true si l'élément doit être placé dans d_first_true. L'expression |
| Exigences de type | ||
-InputIt doit satisfaire les exigences de LegacyInputIterator.
| ||
-OutputIt1, OutputIt2 doit satisfaire les exigences de LegacyOutputIterator.
| ||
-ForwardIt1, ForwardIt2, ForwardIt3 doit satisfaire les exigences de LegacyForwardIterator.
| ||
-UnaryPred doit satisfaire les exigences de Predicate.
| ||
Valeur de retour
Une std::pair construite à partir de l'itérateur de fin de la vue d_first_true et de l'itérateur de fin de la vue d_first_false.
Complexité
Exactement std::distance(first, last) applications de p.
Pour la surcharge (2), il peut y avoir un coût de performance si le type valeur de ForwardIt n'est pas CopyConstructible.
Exceptions
La surcharge avec un paramètre template nommé ExecutionPolicy signale les erreurs comme suit :
- Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que
ExecutionPolicyest l'une des politiques standard, std::terminate est appelé. Pour toute autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme échoue à allouer de la mémoire, std::bad_alloc est levée.
Implémentation possible
| 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);
}
|
Exemple
#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);
}
Sortie :
true_arr: 5 6 7 8 9
false_arr: 0 1 2 3 4
Rapports de défauts
Les rapports de défauts suivants modifiant le comportement ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Apporté à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| P0896R4 | C++11 C++17 |
1. le type valeur de InputIt (C++11)/ForwardIt1 (C++17)devait être CopyAssignable 2. les deux vues de sortie pouvaient se chevaucher |
1. pas exigé 2. le comportement est indéfini dans ce cas |
Voir aussi
| divise une vue d'éléments en deux groupes (fonction template & objet fonction algorithme) | |
(C++20) |
|
| divise les éléments en deux groupes tout en préservant leur ordre relatif dans chaque groupe (fonction template & objet fonction algorithme) | |
(C++20) |
|
(C++11) |
copie une vue d'éléments vers un nouvel emplacement (fonction template & objet fonction algorithme) |
(C++20)(C++20) |
|
| copie une vue d'éléments en omettant ceux qui satisfont des critères spécifiques (fonction template & objet fonction algorithme) | |
(C++20)(C++20) |
|
(C++20) |
copie une vue en divisant les éléments en deux groupes (objet fonction algorithme) |