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
       C++11)
	  std::pair<const T&, const T&>	minmax(	const T& a, const  (1) (const-
       expr since C++14)
	  T& b );
	  template< class T, class Compare >

	  std::pair<const T&, const T&>	minmax(	const T& a, const  (2)	(since
       C++11)
	  T& b,							       (const-
       expr since C++14)

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

				  Compare comp );

	  Returns the lowest and the greatest of the given values.

	  1,2) Returns references to the smaller and the greater of a and b.
	  1) Uses operator< to compare the values.
	  If T is not LessThanComparable, the behavior is undefined.
	  2) Use the comparison	function comp to compare the values.
	  3,4) Returns the smallest and	the greatest of	the values in initial-
       izer list ilist.
	  If ilist.size() is zero, or T	is not CopyConstructible, the behavior
       is undefined.
	  3) Uses operator< to compare the values.
	  If T is not LessThanComparable, the behavior is undefined.
	  4) Use the comparison	function comp to compare the values.

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	 func-
       tion 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.

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) Exactly one comparison using operator<.
	  2) Exactly one application of	the comparison function	comp.
	  3,4) Given \(\scriptsize N\)N	as ilist.size():
	  3) At	most \(\scriptsize \frac{3N}{2}\)

	  3N
	  2

	  comparisons using operator<.
	  4) At	most \(\scriptsize \frac{3N}{2}\)

	  3N
	  2

	  applications of the comparison function comp.

Possible implementation
					       minmax (1)
	  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);
	  }
					       minmax (2)
	  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);
	  }
					       minmax (3)
	  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);
	  }
					       minmax (4)
	  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 <cstdlib>
	#include <ctime>
	#include <iostream>
	#include <vector>

	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		  2024.06.10			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.1.quarterly>

home | help