Namespaces
Variants

std::replace, std::replace_if

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, p.ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Opérations de tri et connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur plages partitionnées)
Opérations d'ensemble (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations de tas
Opérations de minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Défini dans l'en-tête <algorithm>
template< class ForwardIt, class T >
void replace( ForwardIt first, ForwardIt last,
              const T& old_value, const T& new_value );
(1) (jusqu'à C++26)
(constexpr depuis C++20)
template< class ForwardIt, class T = typename std::iterator_traits
                                         <ForwardIt>::value_type >
constexpr void replace( ForwardIt first, ForwardIt last,
                        const T& old_value, const T& new_value );
(depuis C++26)
template< class ExecutionPolicy, class ForwardIt, class T >
void replace( ExecutionPolicy&& policy,
              ForwardIt first, ForwardIt last,
              const T& old_value, const T& new_value );
(2) (depuis C++17)
(jusqu'à C++26)
template< class ExecutionPolicy, class ForwardIt,
          class T = typename std::iterator_traits
                        <ForwardIt>::value_type >
void replace( ExecutionPolicy&& policy,
              ForwardIt first, ForwardIt last,
              const T& old_value, const T& new_value );
(depuis C++26)
template< class ForwardIt, class UnaryPred, class T >
void replace_if( ForwardIt first, ForwardIt last,
                 UnaryPred p, const T& new_value );
(3) (jusqu'à C++26)
(constexpr depuis C++20)
template< class ForwardIt, class UnaryPred,
          class T = typename std::iterator_traits
                        <ForwardIt>::value_type> >
constexpr void replace_if( ForwardIt first, ForwardIt last,
                           UnaryPred p, const T& new_value );
(depuis C++26)
template< class ExecutionPolicy,
          class ForwardIt, class UnaryPred, class T >
void replace_if( ExecutionPolicy&& policy,
                 ForwardIt first, ForwardIt last,
                 UnaryPred p, const T& new_value );
(4) (depuis C++17)
(jusqu'à C++26)
template< class ExecutionPolicy,
          class ForwardIt, class UnaryPred,
          class T = typename std::iterator_traits
                        <ForwardIt>::value_type> >
void replace_if( ExecutionPolicy&& policy,
                 ForwardIt first, ForwardIt last,
                 UnaryPred p, const T& new_value );
(depuis C++26)

Remplace tous les éléments dans la plage [firstlast) par new_value s'ils satisfont à des critères spécifiques.

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 policy.
Ces surcharges participent à la résolution de surcharge uniquement si la valeur de l'expression suivante est true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(jusqu'à C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(depuis C++20)

Si *first = new_value est invalide(jusqu'à C++20)new_value n'est pas accessible en écriture pour first(depuis C++20), le programme est mal formé.

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 v de type (éventuellement const) VT , où VT est le type de valeur de ForwardIt , 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
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator .
-
UnaryPred doit satisfaire aux exigences de Predicate .

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ée. 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é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
(gabarit de fonction & objet fonction d'algorithme)
remplace toutes les valeurs satisfaisant des critères spécifiques par une autre valeur
(objet fonction d'algorithme)