466 lines
29 KiB
Markdown
466 lines
29 KiB
Markdown
[alg.min.max]
|
||
|
||
# 26 Algorithms library [[algorithms]](./#algorithms)
|
||
|
||
## 26.8 Sorting and related operations [[alg.sorting]](alg.sorting#alg.min.max)
|
||
|
||
### 26.8.9 Minimum and maximum [alg.min.max]
|
||
|
||
[ð](#lib:min)
|
||
|
||
`template<class T>
|
||
constexpr const T& min(const T& a, const T& b);
|
||
template<class T, class Compare>
|
||
constexpr const T& min(const T& a, const T& b, Compare comp);
|
||
|
||
template<class T, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<const T*, Proj>> Comp = ranges::less>
|
||
constexpr const T& ranges::min(const T& a, const T& b, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11284)
|
||
|
||
*Preconditions*: For the first form, T meets the[*Cpp17LessThanComparable*](utility.arg.requirements#:Cpp17LessThanComparable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements (Table [29](utility.arg.requirements#tab:cpp17.lessthancomparable "Table 29: Cpp17LessThanComparable requirements"))[.](#1.sentence-1)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11289)
|
||
|
||
*Returns*: The smaller value[.](#2.sentence-1)
|
||
|
||
Returns the first argument when the arguments are equivalent[.](#2.sentence-2)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11294)
|
||
|
||
*Complexity*: Exactly one comparison and two applications of the projection, if any[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11298)
|
||
|
||
*Remarks*: An invocation may explicitly specify
|
||
an argument for the template parameter T of the overloads in namespace std[.](#4.sentence-1)
|
||
|
||
[ð](#lib:min_)
|
||
|
||
`template<class T>
|
||
constexpr T min(initializer_list<T> r);
|
||
template<class T, class Compare>
|
||
constexpr T min(initializer_list<T> r, Compare comp);
|
||
|
||
template<[copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]") T, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<const T*, Proj>> Comp = ranges::less>
|
||
constexpr T ranges::min(initializer_list<T> r, Comp comp = {}, Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
requires [indirectly_copyable_storable](alg.req.ind.copy#concept:indirectly_copyable_storable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, range_value_t<R>*>
|
||
constexpr range_value_t<R>
|
||
ranges::min(R&& r, Comp comp = {}, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
requires [indirectly_copyable_storable](alg.req.ind.copy#concept:indirectly_copyable_storable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, range_value_t<R>*>
|
||
range_value_t<R>
|
||
ranges::min(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11328)
|
||
|
||
*Preconditions*: ranges::distance(r) > 0[.](#5.sentence-1)
|
||
|
||
For the overloads in namespace std,T meets the [*Cpp17CopyConstructible*](utility.arg.requirements#:Cpp17CopyConstructible "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements[.](#5.sentence-2)
|
||
|
||
For the first form, T meets the [*Cpp17LessThanComparable*](utility.arg.requirements#:Cpp17LessThanComparable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements (Table [29](utility.arg.requirements#tab:cpp17.lessthancomparable "Table 29: Cpp17LessThanComparable requirements"))[.](#5.sentence-3)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11336)
|
||
|
||
*Returns*: The smallest value in the input range[.](#6.sentence-1)
|
||
|
||
Returns a copy of the leftmost element
|
||
when several elements are equivalent to the smallest[.](#6.sentence-2)
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11342)
|
||
|
||
*Complexity*: Exactly ranges::distance(r) - 1 comparisons
|
||
and twice as many applications of the projection, if any[.](#7.sentence-1)
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11347)
|
||
|
||
*Remarks*: An invocation may explicitly specify
|
||
an argument for the template parameter T of the overloads in namespace std[.](#8.sentence-1)
|
||
|
||
[ð](#lib:max)
|
||
|
||
`template<class T>
|
||
constexpr const T& max(const T& a, const T& b);
|
||
template<class T, class Compare>
|
||
constexpr const T& max(const T& a, const T& b, Compare comp);
|
||
|
||
template<class T, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<const T*, Proj>> Comp = ranges::less>
|
||
constexpr const T& ranges::max(const T& a, const T& b, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[9](#9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11367)
|
||
|
||
*Preconditions*: For the first form, T meets the[*Cpp17LessThanComparable*](utility.arg.requirements#:Cpp17LessThanComparable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements (Table [29](utility.arg.requirements#tab:cpp17.lessthancomparable "Table 29: Cpp17LessThanComparable requirements"))[.](#9.sentence-1)
|
||
|
||
[10](#10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11372)
|
||
|
||
*Returns*: The larger value[.](#10.sentence-1)
|
||
|
||
Returns the first argument when the arguments are equivalent[.](#10.sentence-2)
|
||
|
||
[11](#11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11377)
|
||
|
||
*Complexity*: Exactly one comparison and two applications of the projection, if any[.](#11.sentence-1)
|
||
|
||
[12](#12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11381)
|
||
|
||
*Remarks*: An invocation may explicitly specify
|
||
an argument for the template parameter T of the overloads in namespace std[.](#12.sentence-1)
|
||
|
||
[ð](#lib:max_)
|
||
|
||
`template<class T>
|
||
constexpr T max(initializer_list<T> r);
|
||
template<class T, class Compare>
|
||
constexpr T max(initializer_list<T> r, Compare comp);
|
||
|
||
template<[copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]") T, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<const T*, Proj>> Comp = ranges::less>
|
||
constexpr T ranges::max(initializer_list<T> r, Comp comp = {}, Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
requires [indirectly_copyable_storable](alg.req.ind.copy#concept:indirectly_copyable_storable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, range_value_t<R>*>
|
||
constexpr range_value_t<R>
|
||
ranges::max(R&& r, Comp comp = {}, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
requires [indirectly_copyable_storable](alg.req.ind.copy#concept:indirectly_copyable_storable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, range_value_t<R>*>
|
||
range_value_t<R>
|
||
ranges::max(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[13](#13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11411)
|
||
|
||
*Preconditions*: ranges::distance(r) > 0[.](#13.sentence-1)
|
||
|
||
For the overloads in namespace std,T meets the [*Cpp17CopyConstructible*](utility.arg.requirements#:Cpp17CopyConstructible "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements[.](#13.sentence-2)
|
||
|
||
For the first form, T meets the [*Cpp17LessThanComparable*](utility.arg.requirements#:Cpp17LessThanComparable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements (Table [29](utility.arg.requirements#tab:cpp17.lessthancomparable "Table 29: Cpp17LessThanComparable requirements"))[.](#13.sentence-3)
|
||
|
||
[14](#14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11419)
|
||
|
||
*Returns*: The largest value in the input range[.](#14.sentence-1)
|
||
|
||
Returns a copy of the leftmost element
|
||
when several elements are equivalent to the largest[.](#14.sentence-2)
|
||
|
||
[15](#15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11425)
|
||
|
||
*Complexity*: Exactly ranges::distance(r) - 1 comparisons
|
||
and twice as many applications of the projection, if any[.](#15.sentence-1)
|
||
|
||
[16](#16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11430)
|
||
|
||
*Remarks*: An invocation may explicitly specify
|
||
an argument for the template parameter T of the overloads in namespace std[.](#16.sentence-1)
|
||
|
||
[ð](#lib:minmax)
|
||
|
||
`template<class T>
|
||
constexpr pair<const T&, const T&> minmax(const T& a, const T& b);
|
||
template<class T, class Compare>
|
||
constexpr pair<const T&, const T&> minmax(const T& a, const T& b, Compare comp);
|
||
|
||
template<class T, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<const T*, Proj>> Comp = ranges::less>
|
||
constexpr ranges::minmax_result<const T&>
|
||
ranges::minmax(const T& a, const T& b, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[17](#17)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11452)
|
||
|
||
*Preconditions*: For the first form, T meets the[*Cpp17LessThanComparable*](utility.arg.requirements#:Cpp17LessThanComparable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements (Table [29](utility.arg.requirements#tab:cpp17.lessthancomparable "Table 29: Cpp17LessThanComparable requirements"))[.](#17.sentence-1)
|
||
|
||
[18](#18)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11457)
|
||
|
||
*Returns*: {b, a} if b is smaller than a, and{a, b} otherwise[.](#18.sentence-1)
|
||
|
||
[19](#19)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11462)
|
||
|
||
*Complexity*: Exactly one comparison and two applications of the projection, if any[.](#19.sentence-1)
|
||
|
||
[20](#20)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11466)
|
||
|
||
*Remarks*: An invocation may explicitly specify
|
||
an argument for the template parameter T of the overloads in namespace std[.](#20.sentence-1)
|
||
|
||
[ð](#lib:minmax_)
|
||
|
||
`template<class T>
|
||
constexpr pair<T, T> minmax(initializer_list<T> t);
|
||
template<class T, class Compare>
|
||
constexpr pair<T, T> minmax(initializer_list<T> t, Compare comp);
|
||
|
||
template<[copyable](concepts.object#concept:copyable "18.6 Object concepts [concepts.object]") T, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<const T*, Proj>> Comp = ranges::less>
|
||
constexpr ranges::minmax_result<T>
|
||
ranges::minmax(initializer_list<T> r, Comp comp = {}, Proj proj = {});
|
||
template<[input_range](range.refinements#concept:input_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
requires [indirectly_copyable_storable](alg.req.ind.copy#concept:indirectly_copyable_storable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, range_value_t<R>*>
|
||
constexpr ranges::minmax_result<range_value_t<R>>
|
||
ranges::minmax(R&& r, Comp comp = {}, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
requires [indirectly_copyable_storable](alg.req.ind.copy#concept:indirectly_copyable_storable "24.3.7.3 Concept indirectly_copyable [alg.req.ind.copy]")<iterator_t<R>, range_value_t<R>*>
|
||
ranges::minmax_result<range_value_t<R>>
|
||
ranges::minmax(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[21](#21)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11497)
|
||
|
||
*Preconditions*: ranges::distance(r) > 0[.](#21.sentence-1)
|
||
|
||
For the overloads in namespace std,T meets the [*Cpp17CopyConstructible*](utility.arg.requirements#:Cpp17CopyConstructible "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements[.](#21.sentence-2)
|
||
|
||
For the first form, type T meets the [*Cpp17LessThanComparable*](utility.arg.requirements#:Cpp17LessThanComparable "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements (Table [29](utility.arg.requirements#tab:cpp17.lessthancomparable "Table 29: Cpp17LessThanComparable requirements"))[.](#21.sentence-3)
|
||
|
||
[22](#22)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11505)
|
||
|
||
*Returns*: Let X be the return type[.](#22.sentence-1)
|
||
|
||
Returns X{x, y},
|
||
where x is a copy of the leftmost element with the smallest value andy a copy of the rightmost element with the largest value
|
||
in the input range[.](#22.sentence-2)
|
||
|
||
[23](#23)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11513)
|
||
|
||
*Complexity*: At most (3/2)ranges::distance(r) applications
|
||
of the corresponding predicate
|
||
and twice as many applications of the projection, if any[.](#23.sentence-1)
|
||
|
||
[24](#24)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11519)
|
||
|
||
*Remarks*: An invocation may explicitly specify
|
||
an argument for the template parameter T of the overloads in namespace std[.](#24.sentence-1)
|
||
|
||
[ð](#lib:min_element)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr ForwardIterator min_element(ForwardIterator first, ForwardIterator last);
|
||
|
||
template<class ExecutionPolicy, class ForwardIterator>
|
||
ForwardIterator min_element(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last);
|
||
|
||
template<class ForwardIterator, class Compare>
|
||
constexpr ForwardIterator min_element(ForwardIterator first, ForwardIterator last,
|
||
Compare comp);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Compare>
|
||
ForwardIterator min_element(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last, Compare comp);
|
||
|
||
template<[forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
constexpr I ranges::min_element(I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::min_element(R&& r, Comp comp = {}, Proj proj = {});
|
||
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I> S,
|
||
class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
I ranges::min_element(Ep&& exec, I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R,
|
||
class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
borrowed_iterator_t<R>
|
||
ranges::min_element(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[25](#25)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11562)
|
||
|
||
Let comp be less{} and proj be identity{} for the overloads with no parameters by those names[.](#25.sentence-1)
|
||
|
||
[26](#26)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11567)
|
||
|
||
*Returns*: The first iterator i in the range [first, last)
|
||
such that for every iterator j in the range [first, last),bool(invoke(comp, invoke(proj, *j), invoke(proj, *i))) is false[.](#26.sentence-1)
|
||
|
||
Returns last if first == last[.](#26.sentence-2)
|
||
|
||
[27](#27)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11577)
|
||
|
||
*Complexity*: Exactly max(last - first - 1,0) comparisons and
|
||
twice as many projections[.](#27.sentence-1)
|
||
|
||
[ð](#lib:max_element)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr ForwardIterator max_element(ForwardIterator first, ForwardIterator last);
|
||
template<class ExecutionPolicy, class ForwardIterator>
|
||
ForwardIterator max_element(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last);
|
||
|
||
template<class ForwardIterator, class Compare>
|
||
constexpr ForwardIterator max_element(ForwardIterator first, ForwardIterator last,
|
||
Compare comp);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Compare>
|
||
ForwardIterator max_element(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last,
|
||
Compare comp);
|
||
|
||
template<[forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
constexpr I ranges::max_element(I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
constexpr borrowed_iterator_t<R>
|
||
ranges::max_element(R&& r, Comp comp = {}, Proj proj = {});
|
||
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I> S,
|
||
class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
I ranges::max_element(Ep&& exec, I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R,
|
||
class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
borrowed_iterator_t<R>
|
||
ranges::max_element(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[28](#28)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11619)
|
||
|
||
Let comp be less{} and proj be identity{} for the overloads with no parameters by those names[.](#28.sentence-1)
|
||
|
||
[29](#29)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11624)
|
||
|
||
*Returns*: The first iterator i in the range [first, last)
|
||
such that for every iterator j in the range [first, last),bool(invoke(comp, invoke(proj, *i), invoke(proj, *j))) is false[.](#29.sentence-1)
|
||
|
||
Returns last if first == last[.](#29.sentence-2)
|
||
|
||
[30](#30)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11634)
|
||
|
||
*Complexity*: Exactly max(last - first - 1,0) comparisons and
|
||
twice as many projections[.](#30.sentence-1)
|
||
|
||
[ð](#lib:minmax_element)
|
||
|
||
`template<class ForwardIterator>
|
||
constexpr pair<ForwardIterator, ForwardIterator>
|
||
minmax_element(ForwardIterator first, ForwardIterator last);
|
||
template<class ExecutionPolicy, class ForwardIterator>
|
||
pair<ForwardIterator, ForwardIterator>
|
||
minmax_element(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last);
|
||
|
||
template<class ForwardIterator, class Compare>
|
||
constexpr pair<ForwardIterator, ForwardIterator>
|
||
minmax_element(ForwardIterator first, ForwardIterator last, Compare comp);
|
||
template<class ExecutionPolicy, class ForwardIterator, class Compare>
|
||
pair<ForwardIterator, ForwardIterator>
|
||
minmax_element(ExecutionPolicy&& exec,
|
||
ForwardIterator first, ForwardIterator last, Compare comp);
|
||
|
||
template<[forward_iterator](iterator.concept.forward#concept:forward_iterator "24.3.4.11 Concept forward_iterator [iterator.concept.forward]") I, [sentinel_for](iterator.concept.sentinel#concept:sentinel_for "24.3.4.7 Concept sentinel_for [iterator.concept.sentinel]")<I> S, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
constexpr ranges::minmax_element_result<I>
|
||
ranges::minmax_element(I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[forward_range](range.refinements#concept:forward_range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
constexpr ranges::minmax_element_result<borrowed_iterator_t<R>>
|
||
ranges::minmax_element(R&& r, Comp comp = {}, Proj proj = {});
|
||
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [random_access_iterator](iterator.concept.random.access#concept:random_access_iterator "24.3.4.13 Concept random_access_iterator [iterator.concept.random.access]") I, [sized_sentinel_for](iterator.concept.sizedsentinel#concept:sized_sentinel_for "24.3.4.8 Concept sized_sentinel_for [iterator.concept.sizedsentinel]")<I> S,
|
||
class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<I, Proj>> Comp = ranges::less>
|
||
ranges::minmax_element_result<I>
|
||
ranges::minmax_element(Ep&& exec, I first, S last, Comp comp = {}, Proj proj = {});
|
||
template<[execution-policy](algorithms.parallel.defns#concept:execution-policy "26.3.1 Preamble [algorithms.parallel.defns]") Ep, [sized-random-access-range](range.refinements#concept:sized-random-access-range "25.4.6 Other range refinements [range.refinements]") R, class Proj = identity,
|
||
[indirect_strict_weak_order](indirectcallable.indirectinvocable#concept:indirect_strict_weak_order "24.3.6.3 Indirect callables [indirectcallable.indirectinvocable]")<projected<iterator_t<R>, Proj>> Comp = ranges::less>
|
||
ranges::minmax_element_result<borrowed_iterator_t<R>>
|
||
ranges::minmax_element(Ep&& exec, R&& r, Comp comp = {}, Proj proj = {});
|
||
`
|
||
|
||
[31](#31)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11680)
|
||
|
||
*Returns*: {first, first} if [first, last) is empty, otherwise{m, M}, where m is
|
||
the first iterator in [first, last) such that no iterator in the range refers
|
||
to a smaller element, and where M is the last iterator[204](#footnote-204 "This behavior intentionally differs from max_element.") in [first, last) such that no iterator in the range refers to a larger element[.](#31.sentence-1)
|
||
|
||
[32](#32)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/algorithms.tex#L11692)
|
||
|
||
*Complexity*: Let N be last - first[.](#32.sentence-1)
|
||
|
||
At most max(â32(Nâ1)â,0) comparisons and
|
||
twice as many applications of the projection, if any[.](#32.sentence-2)
|
||
|
||
[204)](#footnote-204)[204)](#footnoteref-204)
|
||
|
||
This behavior
|
||
intentionally differs from max_element[.](#footnote-204.sentence-1)
|