Namespaces
Variants

std:: partition_copy

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
partition_copy
(C++11)
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
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)
1) Copie les éléments de l'intervalle [ first , last ) vers deux intervalles différents selon la valeur retournée par le prédicat p .
  • Les éléments qui satisfont le prédicat p sont copiés vers l'intervalle commençant à d_first_true .
  • Les autres éléments sont copiés vers l'intervalle commençant à d_first_false .
2) Identique à (1) , mais exécuté selon la policy .
Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'à C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(depuis C++20)

Si * first n'est pas accessible en écriture vers d_first_true ou d_first_false , le programme est mal formé.

Parmi la plage d'entrée et les deux plages de sortie, si deux plages se chevauchent, le comportement est indéfini.

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant la plage source des éléments à copier
d_first_true - le début de la plage de sortie pour les éléments qui satisfont p
d_first_false - le début de la plage 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 p ( v ) doit être convertible en bool pour chaque argument v de type (éventuellement const) VT , où VT est le type de valeur de InputIt , indépendamment de la catégorie de valeur , et ne doit pas modifier v . Ainsi, un type de paramètre VT & n'est pas autorisé , pas plus que VT sauf si pour VT un déplacement est équivalent à une copie (depuis C++11) . ​

Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator .
-
OutputIt1, OutputIt2 doit satisfaire aux exigences de LegacyOutputIterator .
-
ForwardIt1, ForwardIt2, ForwardIt3 doit satisfaire aux exigences de LegacyForwardIterator .
-
UnaryPred doit satisfaire aux exigences de Predicate .

Valeur de retour

Une std::pair construite à partir de l'itérateur vers la fin de la plage d_first_true et de l'itérateur vers la fin de la plage 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 de valeur de ForwardIt n'est pas CopyConstructible .

Exceptions

La surcharge avec un paramètre de modèle 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 ExecutionPolicy fait partie des politiques standard , std::terminate est appelé. Pour tout autre ExecutionPolicy , le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.

Implémentation possible

partition_copy (1)
template<class InputIt, class OutputIt1,
         class OutputIt2, class UnaryPred>
constexpr //< depuis 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 modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
P0896R4 C++11
C++17
1. le type de valeur de InputIt (C++11)/ ForwardIt1 (C++17)
devait être CopyAssignable
2. les deux plages de sortie pouvaient se chevaucher
1. non requis
2. le comportement est
indéfini dans ce cas

Voir aussi

divise une plage d'éléments en deux groupes
(modèle de fonction)
divise les éléments en deux groupes en préservant leur ordre relatif
(modèle de fonction)
copie une plage d'éléments vers un nouvel emplacement
(modèle de fonction)
copie une plage d'éléments en omettant ceux qui satisfont des critères spécifiques
(modèle de fonction)
copie une plage en divisant les éléments en deux groupes
(objet fonction algorithme)