Namespaces
Variants

std:: remove_copy, std:: remove_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
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
remove_copy remove_copy_if
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>
(1)
template < class InputIt, class OutputIt, class T >

OutputIt remove_copy ( InputIt first, InputIt last,

OutputIt d_first, const T & value ) ;
(constexpr depuis C++20)
(jusqu'à C++26)
template < class InputIt, class OutputIt,

class T = typename std:: iterator_traits
< InputIt > :: value_type >
constexpr OutputIt remove_copy ( InputIt first, InputIt last,

OutputIt d_first, const T & value ) ;
(depuis C++26)
(2)
template < class ExecutionPolicy,

class ForwardIt1, class ForwardIt2, class T >
ForwardIt2 remove_copy ( ExecutionPolicy && policy,
ForwardIt1 first, ForwardIt1 last,

ForwardIt2 d_first, const T & value ) ;
(depuis C++17)
(jusqu'à C++26)
template < class ExecutionPolicy,

class ForwardIt1, class ForwardIt2,
class T = typename std:: iterator_traits
< ForwardIt1 > :: value_type >
ForwardIt2 remove_copy ( ExecutionPolicy && policy,
ForwardIt1 first, ForwardIt1 last,

ForwardIt2 d_first, const T & value ) ;
(depuis C++26)
template < class InputIt, class OutputIt, class UnaryPred >

OutputIt remove_copy_if ( InputIt first, InputIt last,

OutputIt d_first, UnaryPred p ) ;
(3) (constexpr depuis C++20)
template < class ExecutionPolicy,

class ForwardIt1, class ForwardIt2, class UnaryPred >
ForwardIt2 remove_copy_if ( ExecutionPolicy && policy,
ForwardIt1 first, ForwardIt1 last,

ForwardIt2 d_first, UnaryPred p ) ;
(4) (depuis C++17)

Copie les éléments de la plage [ first , last ) , vers une autre plage commençant à d_first , en omettant les éléments qui satisfont des critères spécifiques.

1) Ignore tous les éléments qui sont égaux à value (en utilisant operator == ).
3) Ignore tous les éléments pour lesquels le prédicat p retourne true .
2,4) Identique à (1,3) , mais exécuté selon la policy .
Ces surcharges participent à 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 * d_first = * first est invalide (jusqu'à C++20) * first n'est pas accessible en écriture vers d_first (depuis C++20) , le programme est mal formé.

Si les plages source et destination se chevauchent, le comportement est indéfini.

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
value - la valeur des éléments à ne pas copier
policy - la politique d'exécution à utiliser
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 vers l'élément suivant le dernier élément copié.

Complexité

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

1,2) Exactement N comparaisons avec value en utilisant operator == .
3,4) Exactement N applications du prédicat p .

Pour les surcharges avec une ExecutionPolicy, il peut y avoir un coût de performance si ForwardIt1 's value_type 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

remove_copy (1)
template<class InputIt, class OutputIt,
         class T = typename std::iterator_traits<InputIt>::value_type>
constexpr OutputIt remove_copy(InputIt first, InputIt last,
                               OutputIt d_first, const T& value)
{
    for (; first != last; ++first)
        if (!(*first == value))
            *d_first++ = *first;
    return d_first;
}
remove_copy_if (3)
template<class InputIt, class OutputIt, class UnaryPred>
constexpr OutputIt remove_copy_if(InputIt first, InputIt last,
                                  OutputIt d_first, UnaryPred p)
{
    for (; first != last; ++first)
        if (!p(*first))
            *d_first++ = *first;
    return d_first;
}

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_algorithm_default_value_type 202403 (C++26) Initialisation par liste pour les algorithmes ( 1,2 )

Exemple

#include <algorithm>
#include <complex>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
int main()
{
    // Supprime les caractères '#' à la volée.
    std::string str = "#Return #Value #Optimization";
    std::cout << "before: " << std::quoted(str) << '\n';
    std::cout << "after:  \"";
    std::remove_copy(str.begin(), str.end(),
                     std::ostream_iterator<char>(std::cout), '#');
    std::cout << "\"\n";
    // Supprime la valeur {1, 3} à la volée.
    std::vector<std::complex<double>> nums{{2, 2}, {1, 3}, {4, 8}, {1, 3}};
    std::remove_copy(nums.begin(), nums.end(),
                     std::ostream_iterator<std::complex<double>>(std::cout),
    #ifdef __cpp_lib_algorithm_default_value_type
                     {1, 3}); // T est déduit
    #else
                     std::complex<double>{1, 3});
    #endif
}

Sortie :

before: "#Return #Value #Optimization"
after:  "Return Value Optimization"
(2,2)(4,8)

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 Appliqué à Comportement tel que publié Comportement correct
LWG 779 C++98 T devait être EqualityComparable , mais
le type de valeur de ForwardIt n'est pas toujours T
requis que * d_first = * first
soit valide à la place

Voir aussi

supprime les éléments satisfaisant des critères spécifiques
(modèle de fonction)
copie une plage d'éléments vers un nouvel emplacement
(modèle de fonction)
copie une plage en divisant les éléments en deux groupes
(modèle de fonction)
copie une plage d'éléments en omettant ceux qui satisfont des critères spécifiques
(objet fonction algorithme)