Difference between revisions of "cpp/algorithm/ranges/min element"
From cppreference.com
Andreas Krug (Talk | contribs) m (fmt, headers sorted) |
|||
Line 2: | Line 2: | ||
{{cpp/algorithm/ranges/navbar}} | {{cpp/algorithm/ranges/navbar}} | ||
{{dcl begin}} | {{dcl begin}} | ||
− | {{dcl header | algorithm}} | + | {{dcl header|algorithm}} |
− | {{dcl h | Call signature}} | + | {{dcl h|Call signature}} |
− | {{dcl | since=c++20 | num=1 | 1= | + | {{dcl|since=c++20|num=1|1= |
template< std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, | template< std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, | ||
std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less > | std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less > | ||
constexpr I min_element( I first, S last, Comp comp = {}, Proj proj = {} ); | constexpr I min_element( I first, S last, Comp comp = {}, Proj proj = {} ); | ||
}} | }} | ||
− | {{dcl | since=c++20 | num=2 | 1= | + | {{dcl|since=c++20|num=2|1= |
template< ranges::forward_range R, class Proj = std::identity, | template< ranges::forward_range R, class Proj = std::identity, | ||
std::indirect_strict_weak_order< | std::indirect_strict_weak_order< | ||
std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less > | std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less > | ||
constexpr ranges::borrowed_iterator_t<R> | constexpr ranges::borrowed_iterator_t<R> | ||
− | min_element( R&& r, Comp comp = {}, Proj proj = {} ); | + | min_element( R&& r, Comp comp = {}, Proj proj = {} ); |
}} | }} | ||
{{dcl end}} | {{dcl end}} | ||
− | @1@ Finds the smallest element in the range {{ | + | @1@ Finds the smallest element in the range {{|firstlast}}. |
− | @2@ Same as {{v|1}}, but uses {{ | + | @2@ Same as {{v|1}}, but uses {{|r}} as the source range, as if using {{c|ranges::begin(r)}} as {{|first}} and {{c|ranges::end(r)}} as {{|last}}. |
{{cpp/ranges/niebloid}} | {{cpp/ranges/niebloid}} | ||
Line 25: | Line 25: | ||
===Parameters=== | ===Parameters=== | ||
{{par begin}} | {{par begin}} | ||
− | {{par | first, last | iterator-sentinel pair denoting the range to examine}} | + | {{par|first, last|iterator-sentinel pair denoting the range to examine}} |
− | {{par | r | the range to examine}} | + | {{par|r|the range to examine}} |
− | {{par | comp | comparison to apply to the projected elements}} | + | {{par|comp|comparison to apply to the projected elements}} |
− | {{par | proj | projection to apply to the elements}} | + | {{par|proj|projection to apply to the elements}} |
{{par end}} | {{par end}} | ||
===Return value=== | ===Return value=== | ||
− | Iterator to the smallest element in the range {{ | + | Iterator to the smallest element in the range {{|firstlast}}. If several elements in the range are equivalent to the smallest element, returns the iterator to the first such element. Returns {{|first}} if the range is empty. |
===Complexity=== | ===Complexity=== | ||
− | Exactly {{math|max(N-1,0)}} comparisons, where {{c|N {{=}} ranges::distance(first, last)}}. | + | Exactly {{math|max(N - 1, 0)}} comparisons, where {{c|N {{=}} ranges::distance(first, last)}}. |
===Possible implementation=== | ===Possible implementation=== | ||
{{eq fun | {{eq fun | ||
− | + | |1= | |
− | struct min_element_fn { | + | struct min_element_fn |
− | + | { | |
− | + | template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, | |
− | + | std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less> | |
− | + | constexpr I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const | |
− | + | { | |
− | + | if (first == last) | |
− | + | return last; | |
− | + | auto smallest = first; | |
− | + | ++first; | |
− | + | for (; first != last; ++first) | |
− | + | if (!std::invoke(comp, std::invoke(proj, *smallest), std::invoke(proj, *first))) | |
− | + | smallest = first; | |
− | + | ||
} | } | ||
− | |||
− | |||
− | + | template<ranges::forward_range R, class Proj = std::identity, | |
− | + | std::indirect_strict_weak_order< | |
− | + | std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less> | |
− | + | constexpr ranges::borrowed_iterator_t<R> | |
− | + | operator()(R&& r, Comp comp = {}, Proj proj = {}) const | |
− | + | { | |
− | + | return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); | |
− | + | } | |
}; | }; | ||
Line 74: | Line 72: | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | | | |
− | + | |code= | |
#include <algorithm> | #include <algorithm> | ||
+ | |||
#include <iostream> | #include <iostream> | ||
#include <vector> | #include <vector> | ||
− | |||
int main() | int main() | ||
{ | { | ||
− | std::vector<int> v{ 3, 1, -14, 1, 5, 9 }; | + | std::vector<int> v {3, 1, -14, 1, 5, 9}; |
namespace ranges = std::ranges; | namespace ranges = std::ranges; | ||
Line 93: | Line 91: | ||
std::cout << "min element (absolute) at: " << ranges::distance(v.begin(), result) << '\n'; | std::cout << "min element (absolute) at: " << ranges::distance(v.begin(), result) << '\n'; | ||
} | } | ||
− | + | |output= | |
min element at: 2 | min element at: 2 | ||
min element (absolute) at: 1 | min element (absolute) at: 1 | ||
Line 100: | Line 98: | ||
===See also=== | ===See also=== | ||
{{dsc begin}} | {{dsc begin}} | ||
− | {{dsc inc | cpp/algorithm/ranges/dsc max_element}} | + | {{dsc inc|cpp/algorithm/ranges/dsc max_element}} |
− | {{dsc inc | cpp/algorithm/ranges/dsc minmax_element}} | + | {{dsc inc|cpp/algorithm/ranges/dsc minmax_element}} |
− | {{dsc inc | cpp/algorithm/ranges/dsc max}} | + | {{dsc inc|cpp/algorithm/ranges/dsc max}} |
− | {{dsc inc | cpp/algorithm/dsc min_element}} | + | {{dsc inc|cpp/algorithm/dsc min_element}} |
{{dsc end}} | {{dsc end}} | ||
{{langlinks|de|es|fr|it|ja|pt|ru|zh}} | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} |