std::ranges::min
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 smaller of the given projected elements.
The function-like entities described on this page are algorithm function objects (informally known as niebloids), that is:
- Explicit template argument lists cannot be specified when calling any of them.
- None of them are visible to argument-dependent lookup.
- When any of them are found by normal unqualified lookup as the name to the left of the function-call operator, argument-dependent lookup is inhibited.
Contents |
[edit]Parameters
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 |
[edit]Return value
[edit]Complexity
[edit]Possible implementation
struct min_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, b), std::invoke(proj, a))? 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::min_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> requires std::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::min_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, *i), std::invoke(proj, m))) m =*i;return m;}}}; inlineconstexpr min_fn min; |
[edit]Notes
Capturing the result of std::ranges::min
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::min(n +2, n *2);// r is dangling
[edit]Example
#include <algorithm>#include <iostream>#include <string> int main(){namespace ranges = std::ranges;usingnamespace std::string_view_literals; std::cout<<"smaller of 1 and 9999: "<< ranges::min(1, 9999)<<'\n'<<"smaller of 'a', and 'b': '"<< ranges::min('a', 'b')<<"'\n"<<"shortest of \"foo\", \"bar\", and \"hello\": \""<< ranges::min({"foo"sv, "bar"sv, "hello"sv}, {}, &std::string_view::size)<<"\"\n";}
Output:
smaller of 1 and 9999: 1 smaller of 'a', and 'b': 'a' shortest of "foo", "bar", and "hello": "foo"
[edit]See also
(C++20) | returns the greater of the given values (algorithm function object) |
(C++20) | returns the smaller and larger of two elements (algorithm function object) |
(C++20) | returns the smallest element in a range (algorithm function object) |
(C++20) | clamps a value between a pair of boundary values (algorithm function object) |
returns the smaller of the given values (function template) |