std::replace, std::replace_if
| Definido en el encabezado <algorithm>
|
||
template< class ForwardIt, class T >
void replace( ForwardIt first, ForwardIt last,
const T& old_value, const T& new_value );
|
(1) | (hasta C++26) (constexpr desde 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 );
|
(desde 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) | (desde C++17) (hasta 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 );
|
(desde C++26) | |
template< class ForwardIt, class UnaryPred, class T >
void replace_if( ForwardIt first, ForwardIt last,
UnaryPred p, const T& new_value );
|
(3) | (hasta C++26) (constexpr desde 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 );
|
(desde 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) | (desde C++17) (hasta 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 );
|
(desde C++26) | |
Reemplaza todos los elementos en el rango [first, last) con new_value si satisfacen criterios específicos.
old_value (usando operator==).p retorna true.policy.true:
|
|
(hasta C++20) |
|
|
(desde C++20) |
Si *first = new_value no es válido(hasta C++20)new_value no es escribible a first(desde C++20), el programa está mal formado.
Parámetros
| first, last | - | el par de iteradores que define el rango de elementos a procesar |
| old_value | - | el valor de los elementos a reemplazar |
| policy | - | la política de ejecución a utilizar |
| p | - |
predicado unario que retorna
true
si el valor del elemento debe ser reemplazado.
La expresión
p
(
v
)
debe ser convertible a
bool
para cada argumento
|
| new_value | - | el valor a utilizar como reemplazo |
| Requisitos de tipo | ||
-
ForwardIt
debe cumplir con los requisitos de
LegacyForwardIterator
.
|
||
-
UnaryPred
debe cumplir con los requisitos de
Predicate
.
|
||
Complejidad
Dado N como std:: distance ( first, last ) :
Excepciones
Las sobrecargas con un parámetro de plantilla llamado
ExecutionPolicy
reportan errores de la siguiente manera:
-
Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y
ExecutionPolicyes uno de los standard policies , std::terminate es llamado. Para cualquier otroExecutionPolicy, el comportamiento está definido por la implementación. - Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.
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 por lista para algoritmos ( 1-4 ) |
Implementación posible
| reemplazar (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; } |
| reemplazar_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; } |
Ejemplo
#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}; // Reemplazar todas las ocurrencias de 8 con 88. std::replace(s.begin(), s.end(), 8, 88); println(s); // Reemplazar todos los valores menores que 5 con 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); }
Salida:
5 7 4 2 88 6 1 9 0 3 5 7 55 55 88 6 55 9 55 55 (4,2), (4,2)
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 283 | C++98 |
T
se requería que fuera
CopyAssignable
(y
EqualityComparable
para
replace
), pero el tipo de valor de
ForwardIt
no es
siempre
T
y
T
no siempre es escribible en
ForwardIt
|
se requiere que
*
first
=
new_value
sea válido en su lugar |
Véase también
| copia un rango, reemplazando elementos que satisfacen criterios específicos con otro valor (plantilla de función & objeto función de algoritmo) | |
(C++20)(C++20) |
|
(C++20)(C++20) |
reemplaza todos los valores que satisfacen criterios específicos con otro valor (objeto función de algoritmo) |