std::experimental::ranges:: copy, std::experimental::ranges:: copy_if
|
Défini dans l'en-tête
<experimental/ranges/algorithm>
|
||
|
template
<
InputIterator I, Sentinel
<
I
>
S, WeaklyIncrementable O
>
requires IndirectlyCopyable
<
I, O
>
|
(1) | (ranges TS) |
|
template
<
InputRange R, WeaklyIncrementable O
>
requires IndirectlyCopyable
<
ranges::
iterator_t
<
R
>
, O
>
|
(2) | (ranges TS) |
|
template
<
InputIterator I, Sentinel
<
I
>
S, WeaklyIncrementable O,
class
Proj
=
ranges::
identity
,
|
(3) | (ranges TS) |
|
template
<
InputRange R, WeaklyIncrementable O,
class
Proj
=
ranges::
identity
,
|
(4) | (ranges TS) |
Copie les éléments dans la plage source (
[
first
,
last
)
ou
r
) dans la plage de destination commençant à
result
, en partant du premier élément de la plage source et en procédant jusqu'au dernier.
[
first
,
last
)
. Pour chaque entier non négatif
n < (last - first)
, exécute
*
(
result
+
n
)
=
*
(
first
+
n
)
. Le comportement est indéfini si
result
se trouve dans l'intervalle
[
first
,
last
)
. Dans ce cas,
ranges::copy_backward
peut être utilisé à la place.
Nonobstant les déclarations dépeintes ci-dessus, le nombre réel et l'ordre des paramètres de template pour les déclarations d'algorithmes ne sont pas spécifiés. Ainsi, si des arguments de template explicites sont utilisés lors de l'appel d'un algorithme, le programme est probablement non portable.
Table des matières |
Paramètres
| first, last | - | la plage d'éléments à copier |
| r | - | la plage d'éléments à copier |
| result | - | le début de la plage de destination |
| pred | - | prédicat à appliquer aux éléments projetés |
| proj | - | projection à appliquer aux éléments |
Valeur de retour
Un objet
tagged_pair
contenant les deux membres suivants :
-
Le premier membre, avec l'étiquette
tag::in, est l'itérateur de fin de la plage source (c'est-à-dire un itérateur de typeIqui compare égal au sentinelle last ). -
Le deuxième membre, avec l'étiquette
tag::out, est l'itérateur de fin de la plage de résultat.
Complexité
Implémentations possibles
| Première version |
|---|
template<InputIterator I, Sentinel<I> S, WeaklyIncrementable O> requires IndirectlyCopyable<I, O>() ranges::tagged_pair<tag::in(I), tag::out(O)> copy(I first, S last, O result) { for (; first != last; ++first, (void)++result) *result = *first; return {first, result}; } |
| Deuxième version |
template<InputRange R, WeaklyIncrementable O> requires IndirectlyCopyable<ranges::iterator_t<R>, O>() ranges::tagged_pair<tag::in(ranges::safe_iterator_t<R>), tag::out(O)> copy(R&& r, O result) { return ranges::copy(ranges::begin(r), ranges::end(r), result); } |
| Troisième version |
template<InputIterator I, Sentinel<I> S, WeaklyIncrementable O, class Proj = ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred> requires IndirectlyCopyable<I, O>() ranges::tagged_pair<tag::in(I), tag::out(O)> copy_if(I first, S last, O result, Pred pred, Proj proj = Proj{}) { for (; first != last; ++first) if (ranges::invoke(pred, ranges::invoke(proj, *first))) { *result = *first; ++result; } return {first, result}; } |
| Quatrième version |
template<InputRange R, WeaklyIncrementable O, class Proj = ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred> requires IndirectlyCopyable<ranges::iterator_t<R>, O>() ranges::tagged_pair<tag::in(ranges::safe_iterator_t<R>), tag::out(O)> copy_if(R&& r, O result, Pred pred, Proj proj = Proj{}) { return ranges::copy_if(ranges::begin(r), ranges::end(r), result, pred, proj); } |
Exemple
Le code suivant utilise copy pour copier le contenu d'un vecteur vers un autre et afficher le vecteur résultant :
#include <experimental/ranges/algorithm> #include <experimental/ranges/iterator> #include <iostream> #include <numeric> #include <vector> int main() { // see https://en.cppreference.net/w/cpp/language/namespace_alias namespace ranges = std::experimental::ranges; std::vector<int> from_vector(10); std::iota(from_vector.begin(), from_vector.end(), 0); std::vector<int> to_vector; ranges::copy_if(from_vector.begin(), from_vector.end(), ranges::back_inserter(to_vector), [](const auto i) { return i % 3; }); // or, alternatively, // std::vector<int> to_vector(from_vector.size()); // std::copy(from_vector, to_vector.begin()); std::cout << "to_vector contains: "; ranges::copy(to_vector, ranges::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; }
Sortie :
to_vector contains: 1 2 4 5 7 8
Voir aussi
|
(C++11)
|
copie une plage d'éléments vers un nouvel emplacement
(modèle de fonction) |
|
copie une plage d'éléments dans l'ordre inverse
(modèle de fonction) |
|
|
crée une copie d'une plage qui est inversée
(modèle de fonction) |
|
|
copie un nombre d'éléments vers un nouvel emplacement
(modèle de fonction) |
|
|
assigne une valeur spécifique à une plage d'éléments
(modèle de fonction) |
|
|
copie une plage d'éléments en omettant ceux qui satisfont des critères spécifiques
(modèle de fonction) |