std::ranges::partition_copy, std::ranges::partition_copy_result
| 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) |
[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 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.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 :
- Des listes explicites d’arguments template ne peuvent pas être spécifiées lors de l’appel de l’une d’entre elles.
- Aucune d’entre elles n’est visible par la recherche dépendante des arguments.
- Lorsque l’une d’entre elles est trouvée par une recherche non qualifiée normale en tant que nom à gauche de l’opérateur d’appel de fonction, la recherche dépendante des arguments est inhibée.
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
(C++20) |
divise une plage d'éléments en deux groupes (objet fonction d'algorithme) |
(C++20) |
divise les éléments en deux groupes tout en conservant leur ordre relatif au sein de chaque groupe (objet fonction d'algorithme) |
(C++20)(C++20) |
copie une plage d'éléments vers un nouvel emplacement (objet fonction d'algorithme) |
(C++20)(C++20) |
copie une plage d'éléments en omettant ceux qui satisfont à des critères spécifiques (objet fonction d'algorithme) |
(C++11) |
copie une plage en divisant les éléments en deux groupes (modèle de fonction) |