Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
(1) | ||
template<class ForwardIt,class T> void replace( ForwardIt first, ForwardIt last, | (constexpr since C++20) (until C++26) | |
template<class ForwardIt,class T=typenamestd::iterator_traits <ForwardIt>::value_type> | (since C++26) | |
(2) | ||
template<class ExecutionPolicy,class ForwardIt,class T> void replace( ExecutionPolicy&& policy, | (since C++17) (until C++26) | |
template<class ExecutionPolicy,class ForwardIt, class T=typenamestd::iterator_traits | (since C++26) | |
(3) | ||
template<class ForwardIt,class UnaryPred,class T> void replace_if( ForwardIt first, ForwardIt last, | (constexpr since C++20) (until C++26) | |
template<class ForwardIt,class UnaryPred, class T=typenamestd::iterator_traits | (since C++26) | |
(4) | ||
template<class ExecutionPolicy, class ForwardIt,class UnaryPred,class T> | (since C++17) (until C++26) | |
template<class ExecutionPolicy, class ForwardIt,class UnaryPred, | (since C++26) | |
Replaces all elements in the range[
first,
last)
withnew_value if they satisfy specific criteria.
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue. | (since C++20) |
If*first= new_value is invalid(until C++20)new_value is notwritable tofirst(since C++20), the program is ill-formed.
Contents |
first, last | - | the pair of iterators defining therange of elements to process |
old_value | - | the value of elements to replace |
policy | - | theexecution policy to use |
p | - | unary predicate which returns true if the element value should be replaced. The expressionp(v) must be convertible tobool for every argument |
new_value | - | the value to use as replacement |
Type requirements | ||
-ForwardIt must meet the requirements ofLegacyForwardIterator. | ||
-UnaryPred must meet the requirements ofPredicate. |
Given\(\scriptsize N\)N asstd::distance(first, last):
The overloads with a template parameter namedExecutionPolicy
report errors as follows:
ExecutionPolicy
is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined.Because the algorithm takesold_value andnew_value by reference, it can have unexpected behavior if either is a reference to an element of the range[
first,
last)
.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_algorithm_default_value_type | 202403 | (C++26) | List-initialization for algorithms(1-4) |
replace (1) |
---|
template<class ForwardIt,class T=typenamestd::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=typenamestd::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;} |
#include <algorithm>#include <array>#include <complex>#include <functional>#include <iostream> void println(constauto& seq){for(constauto& 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 35 7 55 55 88 6 55 9 55 55(4,2), (4,2)
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 283 | C++98 | T was required to beCopyAssignable (andEqualityComparablefor replace ), but the value type ofForwardIt is notalways T andT is not always writable toForwardIt | required*first= new_value to be valid instead |
copies a range, replacing elements satisfying specific criteria with another value (function template)[edit] | |
(C++20)(C++20) | replaces all values satisfying specific criteria with another value (algorithm function object)[edit] |