Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::minmax(3)		      C++ Standard Libary		std::minmax(3)

NAME
       std::minmax - std::minmax

Synopsis
	  Defined in header <algorithm>
	  template< class T >				       (since
	  std::pair<const T&,const T&> minmax( const	       C++11)
	  T& a,	const T& b );				       (until
							       C++14)
	  template< class T >				       (since
	  constexpr std::pair<const T&,const T&>	       C++14)
	  minmax( const	T& a, const T& b );
	  template< class T, class Compare >
								       (since
	  std::pair<const T&,const T&> minmax( const		       C++11)
	  T& a,	const T& b,					       (until
								       C++14)
	  Compare comp );
	  template< class T, class Compare >

	  constexpr std::pair<const T&,const T&>		       (since
	  minmax( const	T& a, const T& b,	       (1)	       C++14)

	  Compare comp );
	  template<		     class		   T		     >
       (since
	  std::pair<T,T>	 minmax(				   (2)
       C++11)
	  std::initializer_list<T>				       ilist);
       (until
									       C++14)
	  template<		    class		  T		     >
       (since
	  constexpr		      std::pair<T,T>		       minmax(
       C++14)
	  std::initializer_list<T> ilist);
	  template<   class   T,   class   Compare   >			   (3)
       (since
	  std::pair<T,T>					       minmax(
       C++11)
	  std::initializer_list<T>	   ilist,	  Compare	  comp
       (until
	  );								   (4)
       C++14)
	  template< class T, class Compare >
	  constexpr		      std::pair<T,T>		       minmax(
       (since
	  std::initializer_list<T>	   ilist,	  Compare	  comp
       C++14)
	  );

	  Returns the lowest and the greatest of the given values.

	  1-2) Returns references to the smaller and the greater of a and b.
	  3-4) Returns the smallest and	the greatest of	the values in initial-
       izer list ilist.

	  The (1,3) versions use operator< to compare the values, whereas  the
       (2,4) versions
	  use the given	comparison function comp.

Parameters
	  a, b	 -  the	values to compare
	  ilist	 -  initializer	list with the values to	compare
		    comparison	function object	(i.e. an object	that satisfies
       the requirements
		    of Compare)	which returns true if the  first  argument  is
       less than the
		    second.

		    The	signature of the comparison function should be equiva-
       lent to the
		    following:

		    bool cmp(const Type1 &a, const Type2 &b);
	  comp	 -
		    While  the	signature  does	 not need to have const	&, the
       function	must not
		    modify the objects passed to it and	must be	able to	accept
       all values of
		    type (possibly const) Type1	and Type2 regardless of	 value
       category	(thus,
		    Type1 & is not allowed
		    ,  nor is Type1 unless for Type1 a move is equivalent to a
       copy
		    (since C++11)).
		    The	types Type1 and	Type2 must be such that	an  object  of
       type T can be
		    implicitly converted to both of them.

Type requirements
	  -
	  T  must  meet	the requirements of LessThanComparable in order	to use
       overloads (1,3).
	  -
	  T must meet the requirements of CopyConstructible in	order  to  use
       overloads (3,4).

Return value
	  1-2)	Returns	 the  result of	std::pair<const	T&, const T&>(a, b) if
       a<b or if a is
	  equivalent to	b. Returns the result  of  std::pair<const  T&,	 const
       T&>(b, a) if b<a.
	  3-4)	A  pair	 with the smallest value in ilist as the first element
       and the greatest
	  as the second. If several elements are equivalent to	the  smallest,
       the leftmost such
	  element  is  returned.  If  several  elements	 are equivalent	to the
       largest,	the
	  rightmost such element is returned.

Complexity
	  1-2) Exactly one comparison
	  3-4) At most ilist.size() * 3	/ 2 comparisons

Possible implementation
First version
	  template<class T>
	  constexpr std::pair<const T&,	const T&> minmax( const	T& a, const T&
       b )
	  {
	      return (b	< a) ? std::pair<const T&, const T&>(b,	a)
			     : std::pair<const T&, const T&>(a,	b);
	  }

Second version
	  template<class T, class Compare>
	  constexpr std::pair<const T&,	const T&> minmax( const	T& a, const T&
       b, Compare comp )
	  {
	      return comp(b, a)	? std::pair<const T&, const T&>(b, a)
				: std::pair<const T&, const T&>(a, b);
	  }
					      Third version
	  template< class T >
	  constexpr std::pair<T, T> minmax( std::initializer_list<T> ilist )
	  {
	      auto p = std::minmax_element(ilist.begin(), ilist.end());
	      return std::pair(*p.first, *p.second);
	  }
					      Fourth version
	  template< class T, class Compare >
	  constexpr std::pair<T, T>  minmax(  std::initializer_list<T>	ilist,
       Compare comp )
	  {
	      auto p = std::minmax_element(ilist.begin(), ilist.end(), comp);
	      return std::pair(*p.first, *p.second);
	  }

Notes
	  For  overloads  (1,2),  if one of the	parameters is a	temporary, the
       reference returned
	  becomes a dangling reference at the end of the full expression  that
       contains	the
	  call to minmax:

	int n =	1;
	auto p = std::minmax(n,	n+1);
	int m =	p.first; // ok
	int x =	p.second; // undefined behavior

	// Note	that structured	bindings have the same issue
	auto [mm, xx] =	std::minmax(n, n+1);
	xx; // undefined behavior

Example
       // Run this code

	#include <algorithm>
	#include <iostream>
	#include <vector>
	#include <cstdlib>
	#include <ctime>

	int main()
	{
	    std::vector<int> v {3, 1, 4, 1, 5, 9, 2, 6};
	    std::srand(std::time(0));
	    std::pair<int, int>	bounds = std::minmax(std::rand() % v.size(),
						     std::rand() % v.size());

	    std::cout  <<  "v["	<< bounds.first	<< "," << bounds.second	<< "]:
       ";
	    for	(int i = bounds.first; i < bounds.second; ++i) {
		std::cout << v[i] << ' ';
	    }
	    std::cout << '\n';
	}

Possible output:
	v[2,7]:	4 1 5 9	2

See also
	  min		 returns the smaller of	the given values
			 (function template)
	  max		 returns the greater of	the given values
			 (function template)
	  minmax_element returns the smallest and the largest  elements	 in  a
       range
	  (C++11)	 (function template)
	  ranges::minmax returns the smaller and larger	of two elements
	  (C++20)	 (niebloid)

http://cppreference.com		  2022.07.31			std::minmax(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::minmax&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help