std:: replace, std:: replace_if
|
Défini dans l'en-tête
<algorithm>
|
||
| (1) | ||
|
template
<
class
ForwardIt,
class
T
>
void
replace
(
ForwardIt first, ForwardIt last,
|
(constexpr depuis C++20)
(jusqu'à C++26) |
|
|
template
<
class
ForwardIt,
class
T
=
typename
std::
iterator_traits
<
ForwardIt
>
::
value_type
>
|
(depuis C++26) | |
| (2) | ||
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
T
>
void
replace
(
ExecutionPolicy
&&
policy,
|
(depuis C++17)
(jusqu'à C++26) |
|
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
T
=
typename
std::
iterator_traits
|
(depuis C++26) | |
| (3) | ||
|
template
<
class
ForwardIt,
class
UnaryPred,
class
T
>
void
replace_if
(
ForwardIt first, ForwardIt last,
|
(constexpr depuis C++20)
(jusqu'à C++26) |
|
|
template
<
class
ForwardIt,
class
UnaryPred,
class
T
=
typename
std::
iterator_traits
|
(depuis C++26) | |
| (4) | ||
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
UnaryPred,
class
T
>
|
(depuis C++17)
(jusqu'à C++26) |
|
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
UnaryPred,
|
(depuis C++26) | |
Remplace tous les éléments dans la plage
[
first
,
last
)
par
new_value
s'ils satisfont des critères spécifiques.
|
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 = new_value est invalide (jusqu'en C++20) new_value n'est pas accessible en écriture vers first (depuis C++20) , le programme est mal formé.
Table des matières |
Paramètres
| first, last | - | la paire d'itérateurs définissant l'intervalle des éléments à traiter |
| old_value | - | la valeur des éléments à remplacer |
| policy | - | la politique d'exécution à utiliser |
| p | - |
prédicat unaire qui renvoie
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 | ||
-
ForwardIt
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||
-
UnaryPred
doit satisfaire aux exigences de
Predicate
.
|
||
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ée. 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ée.
Notes
Parce que l'algorithme prend
old_value
et
new_value
par référence, il peut avoir un comportement inattendu si l'un ou l'autre est une référence à un élément de la plage
[
first
,
last
)
.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type
|
202403
|
(C++26) | Initialisation par liste pour les algorithmes ( 1-4 ) |
Implémentation possible
| remplacer (1) |
|---|
template<class ForwardIt, class T = typename std::iterator_traits<ForwardIt>::value_type> void replace(ForwardIt first, ForwardIt last, const T& old_value, const T& new_value) { for (; first != last; ++first) if (*first == old_value) *first = new_value; } |
| remplacer_si (3) |
template<class ForwardIt, class UnaryPred, class T = typename std::iterator_traits<ForwardIt>::value_type> void replace_if(ForwardIt first, ForwardIt last, UnaryPred p, const T& new_value) { for (; first != last; ++first) if (p(*first)) *first = new_value; } |
Exemple
#include <algorithm> #include <array> #include <complex> #include <functional> #include <iostream> void println(const auto& seq) { for (const auto& e : seq) std::cout << e << ' '; std::cout << '\n'; } int main() { std::array<int, 10> s{5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; // Remplacer toutes les occurrences de 8 par 88. std::replace(s.begin(), s.end(), 8, 88); println(s); // Remplacer toutes les valeurs inférieures à 5 par 55. std::replace_if(s.begin(), s.end(), std::bind(std::less<int>(), std::placeholders::_1, 5), 55); println(s); std::array<std::complex<double>, 2> nums{{{1, 3}, {1, 3}}}; #ifdef __cpp_lib_algorithm_default_value_type std::replace(nums.begin(), nums.end(), {1, 3}, {4, 2}); #else std::replace(nums.begin(), nums.end(), std::complex<double>{1, 3}, std::complex<double>{4, 2}); #endif println(nums); }
Sortie :
5 7 4 2 88 6 1 9 0 3 5 7 55 55 88 6 55 9 55 55 (4,2), (4,2)
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 283 | C++98 |
T
devait être
CopyAssignable
(et
EqualityComparable
pour
replace
), mais le type de valeur de
ForwardIt
n'est pas
toujours
T
et
T
n'est pas toujours accessible en écriture pour
ForwardIt
|
requis que
*
first
=
new_value
soit valide à la place |
Voir aussi
|
copie une plage en remplaçant les éléments satisfaisant des critères spécifiques par une autre valeur
(modèle de fonction) |
|
|
(C++20)
(C++20)
|
remplace toutes les valeurs satisfaisant des critères spécifiques par une autre valeur
(objet fonction d'algorithme) |