Namespaces
Variants

std::ranges::replace, std::ranges::replace_if

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, p. ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificantes    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificantes
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Operaciones de ordenación y relacionadas
Operaciones de partición
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Algoritmos restringidos
Todos los nombres en este menú pertenecen al espacio de nombres std::ranges
Operaciones de secuencia no modificantes
Operaciones de secuencia modificantes
Operaciones de partición
Operaciones de ordenación
Operaciones de búsqueda binaria (en rangos ordenados)
       
       
Operaciones de conjunto (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
       
       
Operaciones de permutación
Operaciones de plegado
Operaciones sobre almacenamiento no inicializado
Tipos de retorno
 
Definido en el encabezado <algorithm>
Firma de llamada
template< std::input_iterator I, std::sentinel_for<I> S,
          class T1, class T2, class Proj = std::identity >
requires std::indirectly_writable<I, const T2&> &&
         std::indirect_binary_predicate
             <ranges::equal_to, std::projected<I, Proj>, const T1*>
constexpr I replace( I first, S last, const T1& old_value,
                     const T2& new_value, Proj proj = {} );
(1) (desde C++20)
(hasta C++26)
template< std::input_iterator I, std::sentinel_for<I> S,
          class Proj = std::identity,
          class T1 = std::projected_value_t<I, Proj>, class T2 = T1 >
requires std::indirectly_writable<I, const T2&> &&
         std::indirect_binary_predicate
             <ranges::equal_to, std::projected<I, Proj>, const T1*>
constexpr I replace( I first, S last, const T1& old_value,
                     const T2& new_value, Proj proj = {} );
(desde C++26)
template< ranges::input_range R,
          class T1, class T2, class Proj = std::identity >
requires std::indirectly_writable<ranges::iterator_t<R>, const T2&> &&
         std::indirect_binary_predicate
             <ranges::equal_to,
              std::projected<ranges::iterator_t<R>, Proj>, const T1*>
constexpr ranges::borrowed_iterator_t<R>
    replace( R&& r, const T1& old_value,
             const T2& new_value, Proj proj = {} );
(2) (desde C++20)
(hasta C++26)
template< ranges::input_range R,
          class Proj = std::identity,
          class T1 = std::projected_value_t<ranges::iterator_t<R>, Proj>,
          class T2 = T1 >
requires std::indirectly_writable<ranges::iterator_t<R>, const T2&> &&
         std::indirect_binary_predicate
             <ranges::equal_to,
              std::projected<ranges::iterator_t<R>, Proj>, const T1*>
constexpr ranges::borrowed_iterator_t<R>
    replace( R&& r, const T1& old_value,
             const T2& new_value, Proj proj = {} );
(desde C++26)
template< std::input_iterator I, std::sentinel_for<I> S,
          class T, class Proj = std::identity,
          std::indirect_unary_predicate<std::projected<I, Proj>> Pred >
requires std::indirectly_writable<I, const T&>
constexpr I replace_if( I first, S last, Pred pred,
                        const T& new_value, Proj proj = {} );
(3) (desde C++20)
(hasta C++26)
template< std::input_iterator I, std::sentinel_for<I> S,
          class Proj = std::identity,
          class T = std::projected_value_t<I, Proj>,
          std::indirect_unary_predicate<std::projected<I, Proj>> Pred >
requires std::indirectly_writable<I, const T&>
constexpr I replace_if( I first, S last, Pred pred,
                        const T& new_value, Proj proj = {} );
(desde C++26)
template< ranges::input_range R, class T, class Proj = std::identity,
          std::indirect_unary_predicate<
              std::projected<ranges::iterator_t<R>, Proj>> Pred >
requires std::indirectly_writable<ranges::iterator_t<R>, const T&>
constexpr ranges::borrowed_iterator_t<R>
    replace_if( R&& r, Pred pred, const T& new_value, Proj proj = {} );
(4) (desde C++20)
(hasta C++26)
template< ranges::input_range R, class Proj = std::identity,
          class T = std::projected_value_t<ranges::iterator_t<R>, Proj>,
          std::indirect_unary_predicate<
              std::projected<ranges::iterator_t<R>, Proj>> Pred >
requires std::indirectly_writable<ranges::iterator_t<R>, const T&>
constexpr ranges::borrowed_iterator_t<R>
    replace_if( R&& r, Pred pred, const T& new_value, Proj proj = {} );
(desde C++26)

Reemplaza todos los elementos que satisfacen criterios específicos con new_value en el rango [first, last).

1) Reemplaza todos los elementos que son iguales a old_value, usando std::invoke(proj, *i) == old_value para comparar.
3) Reemplaza todos los elementos para los cuales el predicado pred se evalúa como true, donde la expresión de evaluación es std::invoke(pred, std::invoke(proj, *i)).
2,4) Igual que (1,3), pero usa r como rango, como si se usara ranges::begin(r) como first y ranges::end(r) como last.

Las entidades similares a funciones descritas en esta página son objetos de función de algoritmo (informalmente conocidos como niebloids), es decir:

Parámetros

first, last - el par iterador-centinela que define el rango de elementos a procesar
r - el rango de elementos a procesar
old_value - el valor de los elementos a reemplazar
new_value - el valor a utilizar como reemplazo
pred - predicado a aplicar a los elementos proyectados
proj - proyección a aplicar a los elementos

Valor de retorno

Un iterador igual a last .

Complejidad

Exactamente ranges:: distance ( first, last ) aplicaciones del predicado correspondiente comp y cualquier proyección proj .

Notas

Debido a que el algoritmo toma old_value y new_value por referencia, puede tener un comportamiento inesperado si cualquiera de ellos es una referencia a un elemento del rango [ first , last ) .

Macro de prueba de características Valor Estándar Característica
__cpp_lib_algorithm_default_value_type 202403 (C++26) Inicialización de lista para algoritmos ( 1-4 )

Implementación posible

reemplazar (1,2)
struct replace_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S, class Proj = std::identity,
             class T1 = std::projected_value_t<I, Proj>, class T2 = T1>
    requires std::indirectly_writable<I, const T2&> && 
             std::indirect_binary_predicate
                 <ranges::equal_to, std::projected<I, Proj>, const T1*>
    constexpr I operator()(I first, S last, const T1& old_value,
                           const T2& new_value, Proj proj = {}) const
    {
        for (; first != last; ++first)
            if (old_value == std::invoke(proj, *first))
                *first = new_value;
        return first;
    }
    template<ranges::input_range R, class Proj = std::identity
             class T1 = std::projected_value_t<ranges::iterator_t<R>, Proj>,
             class T2 = T1>
    requires std::indirectly_writable<ranges::iterator_t<R>, const T2&> &&
             std::indirect_binary_predicate<ranges::equal_to,
             std::projected<ranges::iterator_t<R>, Proj>, const T1*>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r, const T1& old_value,
                   const T2& new_value, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), old_value,
                       new_value, std::move(proj));
    }
};
inline constexpr replace_fn replace{};
replace_if (3,4)
struct replace_if_fn
{
    template<std::input_iterator I, std::sentinel_for<I> S,
             class Proj = std::identity, class T = std::projected_value_t<I, Proj>,
             std::indirect_unary_predicate<std::projected<I, Proj>> Pred>
    requires std::indirectly_writable<I, const T&>
    constexpr I operator()(I first, S last, Pred pred,
                           const T& new_value, Proj proj = {}) const
    {
        for (; first != last; ++first)
            if (!!std::invoke(pred, std::invoke(proj, *first)))
                *first = new_value;
        return std::move(first);
    }
    template<ranges::input_range R, class Proj = std::identity,
             class T = std::projected_value_t<ranges::iterator_t<R>, Proj>
             std::indirect_unary_predicate
                 <std::projected<ranges::iterator_t<R>, Proj>> Pred>
    requires std::indirectly_writable<ranges::iterator_t<R>, const T&>
    constexpr ranges::borrowed_iterator_t<R>
        operator()(R&& r, Pred pred, const T& new_value, Proj proj = {}) const
    {
        return (*this)(ranges::begin(r), ranges::end(r), std::move(pred),
                       new_value, std::move(proj));
    }
};
inline constexpr replace_if_fn replace_if{};

Ejemplo

#include <algorithm>
#include <array>
#include <complex>
#include <iostream>
void println(const auto& v)
{
    for (const auto& e : v)
        std::cout << e << ' ';
    std::cout << '\n';
}
int main()
{
    namespace ranges = std::ranges;
    std::array p{1, 6, 1, 6, 1, 6};
    println(p);
    ranges::replace(p, 6, 9);
    println(p);
    std::array q{1, 2, 3, 6, 7, 8, 4, 5};
    println(q);
    ranges::replace_if(q, [](int x) { return 5 < x; }, 5);
    println(q);
    std::array<std::complex<double>, 2> nums{{{1, 3}, {1, 3}}};
    println(nums);
    #ifdef __cpp_lib_algorithm_default_value_type
        ranges::replace(nums, {1, 3}, {4, 2});
    #else
        ranges::replace(nums, std::complex<double>{1, 3}, std::complex<double>{4, 2});
    #endif
    println(nums);
}

Salida:

1 6 1 6 1 6
1 9 1 9 1 9
1 2 3 6 7 8 4 5
1 2 3 5 5 5 4 5
(1,3) (1,3)
(4,2) (4,2)

Véase también

copia un rango, reemplazando elementos que cumplen criterios específicos con otro valor
(objeto función de algoritmo)
reemplaza todos los valores que cumplen criterios específicos con otro valor
(plantilla de función)