Namespaces
Variants

std::partition_copy

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur des vues (C++20)
Algorithmes contraints, p.ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations associées
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des vues partitionnées)
Opérations d'ensemble (sur des vues triées)
Opérations de fusion (sur des vues triées)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
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 la vue [firstlast) vers deux vues différentes selon la valeur retournée par le prédicat p.
  • Les éléments qui satisfont le prédicat p sont 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.
2) Identique à (1), mais exécutée selon policy.
Cette surcharge ne participe à la résolution de surcharge que si la valeur de l'expression suivante est true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(jusqu'à C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(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 p(v) doit être convertible en bool pour chaque argument v de type (possiblement const) VT, où VT est le type valeur de InputIt, indépendamment de la catégorie de valeur, et ne doit pas modifier v. Ainsi, un type de paramètre de VT&n'est pas autorisé, ni VT sauf si pour VT un déplacement équivaut à une copie(depuis C++11). ​

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 ExecutionPolicy est l'une des politiques standard, std::terminate est appelé. Pour toute autre ExecutionPolicy, 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)
divise les éléments en deux groupes tout en préservant leur ordre relatif dans chaque groupe
(fonction template & objet fonction algorithme)
copie une vue d'éléments vers un nouvel emplacement
(fonction template & objet fonction algorithme)
copie une vue d'éléments en omettant ceux qui satisfont des critères spécifiques
(fonction template & objet fonction algorithme)
copie une vue en divisant les éléments en deux groupes
(objet fonction algorithme)