std::replace, std::replace_if
| Definiert in Header <algorithm>
|
||
template< class ForwardIt, class T >
void replace( ForwardIt first, ForwardIt last,
const T& old_value, const T& new_value );
|
(1) | (bis C++26) (constexpr seit 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 );
|
(seit 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) | (seit C++17) (bis 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 );
|
(seit C++26) | |
template< class ForwardIt, class UnaryPred, class T >
void replace_if( ForwardIt first, ForwardIt last,
UnaryPred p, const T& new_value );
|
(3) | (bis C++26) (constexpr seit 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 );
|
(seit 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) | (seit C++17) (bis 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 );
|
(seit C++26) | |
Ersetzt alle Elemente im Bereich [first, last) mit new_value, wenn sie bestimmte Kriterien erfüllen.
old_value sind (mit operator==).p true zurückgibt.policy.true ist:
|
|
(bis C++20) |
|
|
(seit C++20) |
Wenn *first = new_value ungültig ist(bis C++20)new_value nicht beschreibbar in first(seit C++20), ist das Programm fehlerhaft.
Parameter
| first, last | - | das Paar von Iteratoren, das den Bereich der zu verarbeitenden Elemente definiert |
| old_value | - | der Wert der zu ersetzenden Elemente |
| policy | - | die zu verwendende Ausführungsrichtlinie |
| p | - |
ein unäres Prädikat, das
true
zurückgibt, wenn der Elementwert ersetzt werden soll.
Der Ausdruck
p
(
v
)
muss für jedes Argument
|
| new_value | - | der als Ersatz zu verwendende Wert |
| Typanforderungen | ||
-
ForwardIt
muss die Anforderungen von
LegacyForwardIterator
erfüllen.
|
||
-
UnaryPred
muss die Anforderungen von
Predicate
erfüllen.
|
||
Komplexität
Gegeben N als std:: distance ( first, last ) :
Ausnahmen
Die Überladungen mit einem Template-Parameter namens
ExecutionPolicy
melden Fehler wie folgt:
-
Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Exception wirft und
ExecutionPolicyeiner der Standard-Policies ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsdefiniert. - Wenn der Algorithmus keinen Speicher allozieren kann, wird std::bad_alloc geworfen.
Hinweise
Da der Algorithmus
old_value
und
new_value
per Referenz entgegennimmt, kann er unerwartetes Verhalten zeigen, falls einer davon eine Referenz auf ein Element des Bereichs
[
first
,
last
)
ist.
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type
|
202403
|
(C++26) | Listeninitialisierung für Algorithmen ( 1-4 ) |
Mögliche Implementierung
| replace (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; } |
| replace_if (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; } |
Beispiel
#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}; // Ersetze alle Vorkommen von 8 durch 88. std::replace(s.begin(), s.end(), 8, 88); println(s); // Ersetze alle Werte kleiner als 5 durch 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); }
Ausgabe:
5 7 4 2 88 6 1 9 0 3 5 7 55 55 88 6 55 9 55 55 (4,2), (4,2)
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 283 | C++98 |
T
musste
CopyAssignable
sein (und
EqualityComparable
für
replace
), aber der Werttyp von
ForwardIt
ist nicht
immer
T
und
T
ist nicht immer in
ForwardIt
schreibbar
|
erfordert stattdessen, dass
*
first
=
new_value
gültig ist |
Siehe auch
| kopiert einen Bereich und ersetzt Elemente, die bestimmte Kriterien erfüllen, durch einen anderen Wert (Funktionsschablone & Algorithmus-Funktionsobjekt) | |
(C++20)(C++20) |
|
(C++20)(C++20) |
ersetzt alle Werte, die bestimmte Kriterien erfüllen, durch einen anderen Wert (Algorithmus-Funktionsobjekt) |