From cppreference.com
Defined in header
Call signature
template<std::forward_iteratorI,std::sentinel_for<I>S,classProj=std::identity,std::indirect_strict_weak_order<std::projected<I,Proj>>Comp=ranges::less>constexprImin_element(Ifirst,Slast,Compcomp={},Projproj={}); (1) (since C++20)template<ranges::forward_rangeR,classProj=std::identity,std::indirect_strict_weak_order<std::projected<ranges::iterator_t<R>,Proj>>Comp=ranges::less>constexprranges::borrowed_iterator_t<R>min_element(R&&r,Compcomp={},Projproj={}); (2) (since C++20)1) Finds the smallest element in the range [first, last).
2) Same as (1), but uses r as the source range, as if using ranges::begin(r) as first and ranges::end(r) as last.
The function-like entities described on this page are
(informally known as niebloids), that is:
Explicit template argument lists cannot be specified when calling any of them.
None of them are visible to
.
When any of them are found by
as the name to the left of the function-call operator,
is inhibited.
Parameters
first, last - the iterator-sentinel pair defining the
of elements to examine r - the
to examine comp - comparison to apply to the projected elements proj - projection to apply to the elements Return value
Iterator to the smallest element in the range [first, last). If several elements in the range are equivalent to the smallest element, returns the iterator to the first such element. Returns the iterator that compares equal to last if the range is empty (i.e., first==last).
Complexity
Exactly max(N - 1, 0) comparisons, where N=ranges::distance(first,last).
Possible implementation
structmin_element_fn{template<std::forward_iteratorI,std::sentinel_for<I>S,classProj=std::identity,std::indirect_strict_weak_order<std::projected<I,Proj>>Comp=ranges::less>constexprIoperator()(Ifirst,Slast,Compcomp={},Projproj={})const{if(first==last)returnlast;autosmallest=first;while(++first!=last)if(std::invoke(comp,std::invoke(proj,*first),std::invoke(proj,*smallest)))smallest=first;returnsmallest;}template<ranges::forward_rangeR,classProj=std::identity,std::indirect_strict_weak_order<std::projected<ranges::iterator_t<R>,Proj>>Comp=ranges::less>constexprranges::borrowed_iterator_t<R>operator()(R&&r,Compcomp={},Projproj={})const{return(*this)(ranges::begin(r),ranges::end(r),std::ref(comp),std::ref(proj));}};inlineconstexprmin_element_fnmin_element;Example
Run this code
#include<algorithm>#include<array>#include<cmath>#include<iostream>intmain(){namespaceranges=std::ranges;std::arrayv{3,1,-13,1,3,7,-13};autoiterator=ranges::min_element(v.begin(),v.end());autoposition=ranges::distance(v.begin(),iterator);std::cout<<"min element is v["<<position<<"] == "<<*iterator<<'\n';autoabs_compare=[](inta,intb){return(std::abs(a)<std::abs(b));};iterator=ranges::min_element(v,abs_compare);position=ranges::distance(v.begin(),iterator);std::cout<<"|min| element is v["<<position<<"] == "<<*iterator<<'\n';}Output:
min element is v[2] == -13 |min| element is v[1] == 1 See also