Namespaces
Variants

std:: copy, std:: copy_if

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
copy copy_if
(C++11)
(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
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 dans la plage, définie par [ first , last ) , vers une autre plage commençant à d_first (plage de destination de copie).

1) Copie tous les éléments dans la plage [ first , last ) en commençant à partir de first et en procédant jusqu'à last .
Si d_first se trouve dans [ first , last ) , le comportement est indéfini. Dans ce cas, std::copy_backward peut être utilisé à la place.
2) Copie les éléments, mais exécuté selon la policy .
Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'à C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(depuis C++20)
Si [ first , last ) et la plage de destination de copie se chevauchent, le comportement est indéfini.
3) Ne copie que 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 [ first , last ) et la plage de destination de copie se chevauchent, le comportement est indéfini.
4) Identique à (3) , mais exécuté selon la policy .
Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'à C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(depuis C++20)

Table des matières

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 de valeur de InputIt , indépendamment de la catégorie de valeur , et ne doit pas modifier v . Ainsi, un type de paramètre VT & n'est pas autorisé , pas plus que VT sauf si pour VT un déplacement est équivalent à 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é

Étant donné N comme std:: distance ( first, last ) :

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

Pour les surcharges avec une ExecutionPolicy , il peut y avoir un coût de performance si le type de 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 fait partie 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é.

Implémentation possible

copier (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;
}
copier_si (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 de 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é lors d'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é lors d'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 vers 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 modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
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
(modèle de fonction)
crée une copie d'une plage inversée
(modèle de fonction)
(C++11)
copie un nombre d'éléments vers un nouvel emplacement
(modèle de fonction)
assigne par copie la valeur donnée à chaque élément d'une plage
(modèle de fonction)
copie une plage d'éléments en omettant ceux qui satisfont des critères spécifiques
(modèle de fonction)
copie une plage d'éléments vers un nouvel emplacement
(objet fonction algorithme)