Namespaces
Variants

std::copy, std::copy_if

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, par 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 connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche dichotomique
(sur plages partitionnées)
Opérations d'ensemble (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations sur les tas
Opérations 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 OutputIt >
OutputIt copy( InputIt first, InputIt last,
               OutputIt d_first );
(1) (constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2 >
ForwardIt2 copy( ExecutionPolicy&& policy,
                 ForwardIt1 first, ForwardIt1 last,
                 ForwardIt2 d_first );
(2) (depuis C++17)
template< class InputIt, class OutputIt, class UnaryPred >
OutputIt copy_if( InputIt first, InputIt last,
                  OutputIt d_first, UnaryPred pred );
(3) (depuis C++11)
(constexpr depuis C++20)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class UnaryPred >
ForwardIt2 copy_if( ExecutionPolicy&& policy,
                    ForwardIt1 first, ForwardIt1 last,
                    ForwardIt2 d_first, UnaryPred pred );
(4) (depuis C++17)

Copie les éléments de la plage définie par [firstlast) vers une autre plage commençant à d_first (plage de destination de la copie).

1) Copie tous les éléments de la plage [firstlast) en commençant par first et en allant jusqu'à last.
Si d_first se trouve dans [firstlast), le comportement est indéfini. Dans ce cas, std::copy_backward peut être utilisé à la place.
2) Copie les éléments, mais exécutée selon policy.
Cette surcharge participe à la résolution de surcharge seulement 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 [firstlast) et la plage de destination de la copie se chevauchent, le comportement est indéfini.
3) Copie uniquement les éléments pour lesquels le prédicat pred retourne true. Cet algorithme de copie est stable : l'ordre relatif des éléments copiés est préservé.
Si [firstlast) et la plage de destination de la copie se chevauchent, le comportement est indéfini.
4) Identique à (3), mais exécutée selon policy.
Cette surcharge participe à la résolution de surcharge seulement 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)

Paramètres

first, last - la paire d'itérateurs définissant la plage source des éléments à copier
d_first - le début de la plage de destination
policy - la politique d'exécution à utiliser
pred - prédicat unaire qui retourne true pour les éléments requis.

L'expression pred(v) doit être convertible en bool pour chaque argument v de type (éventuellement 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é, pas plus que VT sauf si pour VT un déplacement équivaut à une copie(depuis C++11). ​

Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator.
-
OutputIt doit satisfaire aux exigences de LegacyOutputIterator.
-
ForwardIt1, ForwardIt2 doit satisfaire aux exigences de LegacyForwardIterator.
-
UnaryPred doit satisfaire aux exigences de Predicate.

Valeur de retour

Itérateur de sortie vers l'élément dans la plage de destination, un après le dernier élément copié.

Complexité

Soit N tel que std::distance(first, last) :

1,2) Exactement N affectations.
3,4) Exactement N applications du prédicat pred, et au plus N affectations.

Pour les surcharges avec un ExecutionPolicy, il peut y avoir un coût de performance si le type valeur de ForwardIt1 n'est pas MoveConstructible.

Exceptions

Les surcharges avec un paramètre de modèle nommé ExecutionPolicy signalent 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 tout autre ExecutionPolicy, le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levée.

Implémentation possible

copy (1)
template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last,
              OutputIt d_first)
{
    for (; first != last; (void)++first, (void)++d_first)
        *d_first = *first;
    
    return d_first;
}
copy_if (3)
template<class InputIt, class OutputIt, class UnaryPred>
OutputIt copy_if(InputIt first, InputIt last,
                 OutputIt d_first, UnaryPred pred)
{
    for (; first != last; ++first)
        if (pred(*first))
        {
            *d_first = *first;
            ++d_first;
        }
    
    return d_first;
}

Notes

En pratique, les implémentations de std::copy évitent les affectations multiples et utilisent des fonctions de copie en bloc telles que std::memmove si le type valeur est TriviallyCopyable et que les types d'itérateurs satisfont LegacyContiguousIterator.

Lors de la copie de plages qui se chevauchent, std::copy est approprié pour une copie vers la gauche (le début de la plage de destination est en dehors de la plage source) tandis que std::copy_backward est approprié pour une copie vers la droite (la fin de la plage de destination est en dehors de la plage source).

Exemple

Le code suivant utilise std::copy à la fois pour copier le contenu d'un std::vector dans un autre et pour afficher le std::vector résultant.

#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

int main()
{
    std::vector<int> from_vector(10);
    std::iota(from_vector.begin(), from_vector.end(), 0);    
    std::vector<int> to_vector;
    std::copy(from_vector.begin(), from_vector.end(), std::back_inserter(to_vector));

// or, alternatively,
//  std::vector<int> to_vector(from_vector.size());
//  std::copy(from_vector.begin(), from_vector.end(), to_vector.begin());
// either way is equivalent to
//  std::vector<int> to_vector = from_vector;

    std::cout << "to_vector contains: ";
    std::copy(to_vector.begin(), to_vector.end(),
              std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';

    std::cout << "odd numbers in to_vector are: ";
    std::copy_if(to_vector.begin(), to_vector.end(),
                 std::ostream_iterator<int>(std::cout, " "),
                 [](int x) { return x % 2 != 0; });
    std::cout << '\n';

    std::cout << "to_vector contains these multiples of 3: ";
    to_vector.clear();
    std::copy_if(from_vector.begin(), from_vector.end(),
                 std::back_inserter(to_vector),
                 [](int x) { return x % 3 == 0; });

    for (const int x : to_vector)
        std::cout << x << ' ';
    std::cout << '\n';
}

Sortie possible :

to_vector contains: 0 1 2 3 4 5 6 7 8 9
odd numbers in to_vector are: 1 3 5 7 9
to_vector contains these multiples of 3: 0 3 6 9

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 Appliqué à Comportement tel que publié Comportement correct
LWG 2039 C++11 la valeur de retour de std::copy_if n'était pas spécifiée spécifiée
LWG 2044 C++11 la stabilité de std::copy_if n'était pas définie définie

Voir aussi

copie une plage d'éléments dans l'ordre inverse
(fonction patron & objet fonction algorithme)
crée une copie inversée d'une plage
(fonction patron & objet fonction algorithme)
(C++11)
copie un nombre d'éléments vers un nouvel emplacement
(fonction patron & objet fonction algorithme)
affecte par copie la valeur donnée à chaque élément d'une plage
(fonction patron & objet fonction algorithme)
copie une plage d'éléments en omettant ceux qui satisfont à des critères spécifiques
(fonction patron & objet fonction algorithme)
copie une plage d'éléments vers un nouvel emplacement
(objet fonction algorithme)