std::replac...:replace_if(3)
π std::replace, std::replace_if β C++ Standard Libary (section 3) π
okay so bestie, welcome to page std::replac...:replace_if(3) straight out of the C++ Standard Libary manual. Yes, βLibaryβ with one b β thatβs the exact manual name and we are not fixing it, no cap. This is the group-chat rundown for std::replace and std::replace_if, and every single overload is coming with us. π
β¨ NAME β¨
std::replace,std::replace_if β std::replace,std::replace_if
literally the name is the name, periodt. π
πΈ Synopsis πΈ
Defined in header <algorithm>
the replace girlies
template< class ForwardIt, class T >
constexpr void replace( ForwardIt first, ForwardIt last,
const T& old_value, const T& new_value );
constexpr since C++20; until C++26.
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 );
since 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 );
since C++17; until 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 );
since C++26.
the numbered replace_if overloads
(1)
template< class ForwardIt, class UnaryPred, class T >
constexpr void replace_if( ForwardIt first, ForwardIt last,
UnaryPred p, const T& new_value );
constexpr since C++20; until C++26.
(2)
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 );
since C++26.
(3)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred, class T >
void replace_if( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last,
UnaryPred p, const T& new_value );
since C++17; until C++26.
(4)
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 );
since C++26.
what it do, bestie
Replaces all elements in the range [first, last) with new_value if they satisfy specific criteria. π
- Replaces all elements that are equal to
old_value(usingoperator==). - Replaces all elements for which predicate
preturnstrue. 2,4) Same as(1,3), but executed according topolicy.
These overloads participate in overload resolution only if
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true.
until C++20
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true.
since C++20
If*first = new_valueis invalid (until C++20), ornew_valueis not writable tofirst(since C++20), the program is ill-formed. Like, not βoops,β actually ill-formed. π
π¦ Parameters π¦
- first, last β the range of elements to process.
- old_value β the value of elements to replace.
- policy β the execution policy to use. See execution policy for details.
- p β unary predicate which returns
trueif the element value should be replaced. The expressionp(v)must be convertible toboolfor every argumentvof type (possibly const)VT, whereVTis the value type ofForwardIt, regardless of value category, and must not modifyv. Thus, a parameter type ofVT&is not allowed, nor isVTunless forVTa move is equivalent to a copy (since C++11). - new_value β the value to use as replacement.
π Type requirements π
ForwardItmust meet the requirements ofLegacyForwardIterator.UnaryPredmust meet the requirements ofPredicate.
π Return value π
(none)
thatβs it. no sneaky return, bestie. π«Ά
β Complexity β
Given \(\scriptsize N\)N as std::distance(first, last):
1,2)Exactly\(\scriptsize N\)Ncomparisons usingoperator==.3,4)Exactly\(\scriptsize N\)Napplications of the predicatep.
π₯ Exceptions π₯
The overloads with a template parameter named ExecutionPolicy report errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicyis one of the standard policies,std::terminateis called. For any otherExecutionPolicy, the behavior is implementation-defined. - If the algorithm fails to allocate memory,
std::bad_allocis thrown.
π Notes π
Because the algorithm takes old_value and new_value by reference, it can have unexpected behavior if either is a reference to an element of the range [first, last).
thatβs the βwait, what?β corner, bestie. read it twice. π
Feature-test macro:
__cpp_lib_algorithm_default_value_typeβ value202403, std(C++26), feature: List-initialization for algorithms(1-4).
π§ Possible implementation π§
replace
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
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;
}
πΈ Example πΈ
the page says // Run this code, so hereβs the code, bestie:
#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};
// Replace all occurrences of 8 with 88.
std::replace(s.begin(), s.end(), 8, 88);
println(s);
// Replace all values less than 5 with 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);
}
π Output π
5 7 4 2 88 6 1 9 0 3
5 7 55 55 88 6 55 9 55 55
(4,2), (4,2)
π Defect reports π
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
- DR
LWG 283, applied to C++98. Behavior as published:Twas required to beCopyAssignable(andEqualityComparableforreplace), but the value type ofForwardItis not alwaysTandTis not always writable toForwardIt. Correct behavior: required*first = new_valueto be valid instead.
π See also π
replace_copy,replace_copy_ifβ copies a range, replacing elements satisfying specific criteria with another value (function template).ranges::replace,ranges::replace_if(C++20)β replaces all values satisfying specific criteria with another value (niebloid)(C++20).
thatβs the whole page, bestie π«Άπ β sourced from http://cppreference.com, version/date 2024.06.10, and the page label is std::replac...:replace_if(3). mwah π
β¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms