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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
std::ranges
Non-modifying sequence operations | |||||||||||||||||||||||||||||||||
Modifying sequence operations | |||||||||||||||||||||||||||||||||
Partitioning operations | |||||||||||||||||||||||||||||||||
Sorting operations | |||||||||||||||||||||||||||||||||
Binary search operations (on sorted ranges) | |||||||||||||||||||||||||||||||||
Set operations (on sorted ranges) | |||||||||||||||||||||||||||||||||
Heap operations | |||||||||||||||||||||||||||||||||
Minimum/maximum operations | |||||||||||||||||||||||||||||||||
Permutation operations | |||||||||||||||||||||||||||||||||
Fold operations | |||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||
Operations on uninitialized storage | |||||||||||||||||||||||||||||||||
Return types | |||||||||||||||||||||||||||||||||
Defined in header <algorithm> | ||
Call signature | ||
(1) | ||
template<std::input_iterator I,std::sentinel_for<I> S, class T1,class T2,class Proj=std::identity> | (since C++20) (until C++26) | |
template<std::input_iterator I,std::sentinel_for<I> S, class Proj=std::identity, | (since C++26) | |
(2) | ||
template<ranges::input_range R, class T1,class T2,class Proj=std::identity> | (since C++20) (until C++26) | |
template<ranges::input_range R, class Proj=std::identity, | (since C++26) | |
(3) | ||
template<std::input_iterator I,std::sentinel_for<I> S, class T,class Proj=std::identity, | (since C++20) (until C++26) | |
template<std::input_iterator I,std::sentinel_for<I> S, class Proj=std::identity, | (since C++26) | |
(4) | ||
template<ranges::input_range R,class T,class Proj=std::identity, std::indirect_unary_predicate< | (since C++20) (until C++26) | |
template<ranges::input_range R,class Proj=std::identity, class T= std::projected_value_t<ranges::iterator_t<R>, Proj>, | (since C++26) | |
Replaces all elements satisfying specific criteria withnew_value in the range[
first,
last)
.
The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
first, last | - | the iterator-sentinel pair defining therange of elements to process |
r | - | the range of elements to process |
old_value | - | the value of elements to replace |
new_value | - | the value to use as a replacement |
pred | - | predicate to apply to the projected elements |
proj | - | projection to apply to the elements |
An iterator equal tolast.
Exactlyranges::distance(first, last) applications of the corresponding predicatecomp and any projectionproj.
Because the algorithm takesold_value andnew_value by reference, it may 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,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> requiresstd::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::identityclass T1= std::projected_value_t<ranges::iterator_t<R>, Proj>,class T2= T1> requiresstd::indirectly_writable<ranges::iterator_t<R>,const T2&>&&std::indirect_binary_predicate<ranges::equal_to, std::projected<ranges::iterator_t<R>, Proj>,const T1*>constexprranges::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));}}; inlineconstexpr 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> requiresstd::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> requiresstd::indirectly_writable<ranges::iterator_t<R>,const T&>constexprranges::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));}}; inlineconstexpr replace_if_fn replace_if{}; |
#include <algorithm>#include <array>#include <complex>#include <iostream> void println(constauto& v){for(constauto& 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){return5< 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);}
Output:
1 6 1 6 1 61 9 1 9 1 91 2 3 6 7 8 4 51 2 3 5 5 5 4 5(1,3) (1,3)(4,2) (4,2)
(C++20)(C++20) | copies a range, replacing elements satisfying specific criteria with another value (algorithm function object)[edit] |
replaces all values satisfying specific criteria with another value (function template)[edit] |