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,
|
(1) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
T
>
|
(2) | (depuis C++17) |
| (3) | ||
|
template
<
class
InputIt,
class
OutputIt,
class
UnaryPred,
class
T
>
OutputIt replace_copy_if
|
(constexpr depuis C++20)
(jusqu'à C++26) |
|
|
template
<
class
InputIt,
class
OutputIt,
class
UnaryPred,
class
T
=
typename
std::
iterator_traits
|
(depuis C++26) | |
| (4) | ||
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
UnaryPred,
class
T
>
|
(depuis C++17)
(jusqu'à C++26) |
|
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
UnaryPred,
class
T
=
typename
std::
iterator_traits
|
(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
.
|
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
|
| 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 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) |
|
|
(C++20)
(C++20)
|
copie une plage en remplaçant les éléments satisfaisant des critères spécifiques par une autre valeur
(objet fonction algorithme) |