std::replace_copy, std::replace_copy_if
| 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) |
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 );
|
(3) | (jusqu'à C++26) (constexpr depuis C++20) |
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) | |
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 );
|
(4) | (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.
old_value (en utilisant operator==).p retourne true.policy.true :
|
|
(jusqu'à C++20) |
|
|
(depuis C++20) |
Si l'un des résultats des expressions *first et new_value n'est pas inscriptible vers d_first, le programme est mal formé.
Si les plages source et destination se chevauchent, le comportement est indéfini.
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
|
| 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 ) :
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
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, 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 |
-
↑
Le défaut réel dans la norme C++ est que le paramètre de template
InputIteratora été mal spécifié commeIterator. 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 parIteratorimpliquent les exigences de type des catégories d'itérateurs correspondantes.
Voir aussi
| remplace toutes les valeurs répondant à des critères spécifiques par une autre valeur (modèle de fonction & objet fonction d'algorithme) | |
(C++20)(C++20) |
|
| supprime les éléments répondant à des critères spécifiques (modèle de fonction & objet fonction d'algorithme) | |
(C++20)(C++20) |
|
(C++20)(C++20) |
copie une plage, en remplaçant les éléments répondant à des critères spécifiques par une autre valeur (objet fonction d'algorithme) |