std::ranges::min_element - cppreference.com

From cppreference.com

Defined in header

<algorithm>

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

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.

Parameters

first, last - the iterator-sentinel pair defining the

range

of elements to examine r - the

range

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