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 | ||
template<class T,class Proj=std::identity, std::indirect_strict_weak_order< | (1) | (since C++20) |
template<std::copyable T,class Proj=std::identity, std::indirect_strict_weak_order< | (2) | (since C++20) |
template<ranges::input_range R,class Proj=std::identity, std::indirect_strict_weak_order< | (3) | (since C++20) |
Returns the greater of the given projected values.
The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
a, b | - | the values to compare |
r | - | the range of values to compare |
comp | - | comparison to apply to the projected elements |
proj | - | projection to apply to the elements |
struct max_fn{template<class T,class Proj=std::identity,std::indirect_strict_weak_order< std::projected<const T*, Proj>> Comp=ranges::less>constexprconst T& operator()(const T& a,const T& b, Comp comp={}, Proj proj={})const{returnstd::invoke(comp,std::invoke(proj, a),std::invoke(proj, b))? b: a;} template<std::copyable T,class Proj=std::identity,std::indirect_strict_weak_order< std::projected<const T*, Proj>> Comp=ranges::less>constexpr T operator()(std::initializer_list<T> r, Comp comp={}, Proj proj={})const{return*ranges::max_element(r,std::ref(comp),std::ref(proj));} template<ranges::input_range R,class Proj=std::identity,std::indirect_strict_weak_order< std::projected<ranges::iterator_t<R>, Proj>> Comp=ranges::less> requiresstd::indirectly_copyable_storable<ranges::iterator_t<R>,ranges::range_value_t<R>*>constexprranges::range_value_t<R> operator()(R&& r, Comp comp={}, Proj proj={})const{using V=ranges::range_value_t<R>;ifconstexpr(ranges::forward_range<R>)returnstatic_cast<V>(*ranges::max_element(r,std::ref(comp),std::ref(proj)));else{auto i=ranges::begin(r);auto s=ranges::end(r); V m(*i);while(++i!= s)if(std::invoke(comp,std::invoke(proj, m),std::invoke(proj,*i))) m=*i;return m;}}}; inlineconstexpr max_fn max; |
Capturing the result ofstd::ranges::max
by reference produces a dangling reference if one of the parameters is a temporary and that parameter is returned:
int n=-1;constint& r= std::ranges::max(n+2, n*2);// r is dangling
#include <algorithm>#include <iostream>#include <string> static_assert(std::ranges::max({0B10,0X10,010,10})==16);// overload (2) int main(){namespace ranges= std::ranges;usingnamespace std::string_view_literals; std::cout<<"larger of 1 and 9999: "<< ranges::max(1,9999)<<'\n'<<"larger of 'a', and 'b': '"<< ranges::max('a','b')<<"'\n"<<"longest of\"foo\",\"bar\", and\"hello\":\""<< ranges::max({"foo"sv,"bar"sv,"hello"sv},{},&std::string_view::size)<<"\"\n";}
Output:
larger of 1 and 9999: 9999larger of 'a', and 'b': 'b'longest of "foo", "bar", and "hello": "hello"
(C++20) | returns the smaller of the given values (algorithm function object)[edit] |
(C++20) | returns the smaller and larger of two elements (algorithm function object)[edit] |
(C++20) | returns the largest element in a range (algorithm function object)[edit] |
(C++20) | clamps a value between a pair of boundary values (algorithm function object)[edit] |
returns the greater of the given values (function template)[edit] |