Namespaces
Variants

std::ranges::partition_copy, std::ranges::partition_copy_result

De fr.cppreference.net
 
 
Bibliothèque d’algorithmes
Algorithmes contraints et algorithmes sur les plages (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)

Opérations de tri et apparentées
Opérations de partitionnement
(C++11)    

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


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l’espace de noms std::ranges
Opérations de séquence non modificatrices
Opérations de séquence modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des plages triées)
       
       
Opérations d’ensemble (sur des plages triées)
Opérations de tas
Opérations de minimum/maximum
       
       
Opérations de permutation
Opérations de pliage (fold)
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l’en‑tête <algorithm>
Signature d’appel
template< std::input_iterator I, std::sentinel_for<I> S,
          std::weakly_incrementable O1, std::weakly_incrementable O2,
          class Proj = std::identity,
          std::indirect_unary_predicate<std::projected<I, Proj>> Pred >
requires std::indirectly_copyable<I, O1> &&
         std::indirectly_copyable<I, O2>
constexpr partition_copy_result<I, O1, O2>
    partition_copy( I first, S last, O1 out_true, O2 out_false,
                    Pred pred, Proj proj = {} );
(1) (depuis C++20)
template< ranges::input_range R,
          std::weakly_incrementable O1, std::weakly_incrementable O2,
          class Proj = std::identity,
          std::indirect_unary_predicate<std::projected<iterator_t<R>, Proj>> Pred >
requires std::indirectly_copyable<ranges::iterator_t<R>, O1> &&
         std::indirectly_copyable<ranges::iterator_t<R>, O2>
constexpr partition_copy_result<ranges::borrowed_iterator_t<R>, O1, O2>
    partition_copy( R&& r, O1 out_true, O2 out_false,
                    Pred pred, Proj proj = {} );
(2) (depuis C++20)
Types auxiliaires
template< class I, class O1, class O2 >
using partition_copy_result = ranges::in_out_out_result<I, O1, O2>;
(3) (depuis C++20)
1) Copie les éléments de la plage d’entrée [firstlast) vers deux plages de sortie différentes selon la valeur retournée par le prédicat pred. Les éléments qui satisfont le prédicat pred après projection par proj sont copiés dans la plage commençant à out_true. Les autres éléments sont copiés dans la plage commençant à out_false. Le comportement est indéfini si la plage d’entrée chevauche l’une des plages de sortie.
2) Identique à (1), mais utilise r comme plage source, comme si on utilisait ranges::begin(r) comme first, et ranges::end(r) comme last.

Les entités de type fonction décrites sur cette page sont des objets fonctions d’algorithmes (informellement appelés niebloids), c’est-à-dire :

Paramètres

first, last - la paire itérateur-sentinelle définissant la plage source des éléments à copier
r - la plage source des éléments à copier
out_true - le début de la plage de sortie pour les éléments qui satisfont pred
out_false - le début de la plage de sortie pour les éléments qui ne satisfont pas pred
pred - prédicat à appliquer aux éléments projetés
proj - projection à appliquer aux éléments

Valeur de retour

{ last, o1, o2 } , où o1 et o2 sont les extrémités des plages de sortie respectivement, après la fin de la copie.

Complexité

Exactement ranges:: distance ( first, last ) applications du prédicat correspondant comp et de toute projection proj .

Implémentation possible

struct partition_copy_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S,
             std::weakly_incrementable O1, std::weakly_incrementable O2,
             class Proj = std::identity, std::indirect_unary_predicate<
             std::projected<I, Proj>> Pred>
    requires std::indirectly_copyable<I, O1> && std::indirectly_copyable<I, O2>
    constexpr ranges::partition_copy_result<I, O1, O2>
        operator()(I first, S last, O1 out_true, O2 out_false,
                   Pred pred, Proj proj = {}) const
    {
        for (; first != last; ++first)
            if (!!std::invoke(pred, std::invoke(proj, *first)))
                *out_true = *first, ++out_true;
            else
                *out_false = *first, ++out_false;
        return {std::move(first), std::move(out_true), std::move(out_false)};
    }
    template<ranges::input_range R,
             std::weakly_incrementable O1, std::weakly_incrementable O2,
             class Proj = std::identity,
             std::indirect_unary_predicate<std::projected<iterator_t<R>, Proj>> Pred>
    requires std::indirectly_copyable<ranges::iterator_t<R>, O1> &&
             std::indirectly_copyable<ranges::iterator_t<R>, O2>
    constexpr ranges::partition_copy_result<ranges::borrowed_iterator_t<R>, O1, O2>
        operator()(R&& r, O1 out_true, O2 out_false, Pred pred, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(out_true),
                       std::move(out_false), std::move(pred), std::move(proj));
    }
};
inline constexpr partition_copy_fn partition_copy {};

Exemple

#include <algorithm>
#include <cctype>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
    const auto in = {'N', '3', 'U', 'M', '1', 'B', '4', 'E', '1', '5', 'R', '9'};
    std::vector<int> o1(size(in)), o2(size(in));
    auto pred = [](char c) { return std::isalpha(c); };
    auto ret = std::ranges::partition_copy(in, o1.begin(), o2.begin(), pred);
    std::ostream_iterator<char> cout {std::cout, " "};
    std::cout << "in = ";
    std::ranges::copy(in, cout);
    std::cout << "\no1 = ";
    std::copy(o1.begin(), ret.out1, cout);
    std::cout << "\no2 = ";
    std::copy(o2.begin(), ret.out2, cout);
    std::cout << '\n';
}

Sortie :

in = N 3 U M 1 B 4 E 1 5 R 9
o1 = N U M B E R
o2 = 3 1 4 1 5 9

Voir aussi

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