Namespaces
Variants

std:: replace_copy, std:: replace_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
replace_copy replace_copy_if

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, class T >

OutputIt replace_copy ( InputIt first, InputIt last, OutputIt d_first,

const T & old_value, const T & new_value ) ;
(1) (constexpr depuis C++20)
template < class ExecutionPolicy,

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

const T & old_value, const T & new_value ) ;
(2) (depuis C++17)
(3)
template < class InputIt, class OutputIt, class UnaryPred, class T >

OutputIt replace_copy_if
( InputIt first, InputIt last, OutputIt d_first,

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

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

UnaryPred p, const T & new_value ) ;
(depuis C++26)
(4)
template < class ExecutionPolicy, class ForwardIt1, class ForwardIt2,

class UnaryPred, class T >
ForwardIt2 replace_copy_if
( ExecutionPolicy && policy,
ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first,

UnaryPred p, const T & new_value ) ;
(depuis C++17)
(jusqu'à C++26)
template < class ExecutionPolicy, class ForwardIt1, class ForwardIt2,

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

UnaryPred p, const T & new_value ) ;
(depuis C++26)

Copie les éléments de la plage [ first , last ) vers une autre plage commençant à d_first , tout en remplaçant tous les éléments satisfaisant des critères spécifiques par new_value .

1) Remplace tous les éléments qui sont égaux à old_value (en utilisant operator == ).
3) Remplace tous les éléments pour lesquels le prédicat p renvoie 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 l'un des résultats des expressions * first et new_value n'est pas accessible en écriture vers d_first , 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
old_value - la valeur des éléments à remplacer
policy - la politique d'exécution à utiliser
p - prédicat unaire qui retourne ​ true si la valeur de l'élément doit être remplacée.

L'expression p ( 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) . ​

new_value - la valeur à utiliser comme remplacement
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 .

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 en utilisant operator == .
3,4) Exactement N applications du prédicat p .

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

replace_copy (1)
template<class InputIt, class OutputIt, class T>
OutputIt replace_copy(InputIt first, InputIt last, OutputIt d_first,
                      const T& old_value, const T& new_value)
{
    for (; first != last; ++first)
        *d_first++ = (*first == old_value) ? new_value : *first;
    return d_first;
}
replace_copy_if (3)
template<class InputIt, class OutputIt, class UnaryPred,
         class T = typename std::iterator_traits<ForwardIt>::value_type>
OutputIt replace_copy_if(InputIt first, InputIt last, OutputIt d_first,
                         UnaryPred p, const T& new_value)
{
    for (; first != last; ++first)
        *d_first++ = p(*first) ? new_value : *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 ( 3,4 )

Exemple

#include <algorithm>
#include <complex>
#include <iostream>
#include <vector>
void println(const auto& seq)
{
    for (const auto& e : seq)
        std::cout << e << ' ';
    std::cout << '\n';
}
int main()
{
    std::vector<short> src{3, 1, 4, 1, 5, 9, 2, 6, 5};
    println(src);
    std::vector<int> dst(src.size());
    std::replace_copy_if(src.cbegin(), src.cend(),
                         dst.begin(),
                         [](short n){ return n > 5; }, 0);
    println(dst);
    std::vector<std::complex<double>> src2{{1, 3}, {2, 4}, {3, 5}},
                                      dst2(src2.size());
    println(src2);
    #ifdef __cpp_lib_algorithm_default_value_type
        std::replace_copy_if(src2.cbegin(), src2.cend(), dst2.begin(),
            [](std::complex<double> z){ return std::abs(z) < 5; },
            {4, 2}); // Possible, since the T is deduced.
    #else
        std::replace_copy_if(src2.cbegin(), src2.cend(), dst2.begin(),
            [](std::complex<double> z){ return std::abs(z) < 5; },
            std::complex<double>{4, 2});
    #endif
    println(dst2);
}

Sortie :

3 1 4 1 5 9 2 6 5 
3 1 4 1 5 0 2 0 5 
(1,3) (2,4) (3,5) 
(4,2) (4,2) (3,5)

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 publié Comportement corrigé
LWG 283 C++98 T devait être CopyAssignable (et EqualityComparable pour
replace_copy ), mais le type de valeur de InputIt n'est pas toujours T
a supprimé l'exigence
LWG 337 C++98 replace_copy_if exigeait seulement que InputIt
satisfasse aux exigences de LegacyIterator [1]
corrigé en
LegacyInputIterator
  1. Le défaut réel dans la norme C++ est que le paramètre de template InputIterator a été mal spécifié comme Iterator . Cela affecte les exigences de type car la norme C++ stipule que pour les modèles de fonction dans la bibliothèque d'algorithmes, les paramètres de type template dont le nom se termine par Iterator impliquent les exigences de type des catégories d'itérateurs correspondantes.

Voir aussi

remplace toutes les valeurs satisfaisant des critères spécifiques par une autre valeur
(modèle de fonction)
supprime les éléments satisfaisant des critères spécifiques
(modèle de fonction)
copie une plage en remplaçant les éléments satisfaisant des critères spécifiques par une autre valeur
(objet fonction algorithme)