Namespaces
Variants

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

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
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
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types
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 [ first , last ) 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 vers la plage commençant à out_true . Les autres éléments sont copiés vers 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 fonction d'algorithme (informellement appelés niebloids ), c'est-à-dire :

Table des matières

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