std::minmax
| Deklariert in Header <algorithm>
|
||
template< class T >
std::pair<const T&, const T&> minmax( const T& a, const T& b );
|
(1) | (seit C++11) (constexpr seit C++14) |
template< class T, class Compare >
std::pair<const T&, const T&> minmax( const T& a, const T& b,
Compare comp );
|
(2) | (seit C++11) (constexpr seit C++14) |
template< class T >
std::pair<T, T> minmax( std::initializer_list<T> ilist );
|
(3) | (seit C++11) (constexpr seit C++14) |
template< class T, class Compare >
std::pair<T, T> minmax( std::initializer_list<T> ilist,
Compare comp );
|
(4) | (seit C++11) (constexpr seit C++14) |
Gibt den kleinsten und den größten der gegebenen Werte zurück.
a und b zurück.operator<, um die Werte zu vergleichen.T nicht LessThanComparable ist, ist das Verhalten undefiniert.comp, um die Werte zu vergleichen.ilist zurück.operator<, um die Werte zu vergleichen.T nicht LessThanComparable ist, ist das Verhalten undefiniert.comp, um die Werte zu vergleichen.Parameter
| a, b | - | die zu vergleichenden Werte |
| ilist | - | Initialisierungsliste mit den zu vergleichenden Werten |
| comp | - | Vergleichsfunktionsobjekt (d. h. ein Objekt, das die Anforderungen von Compare erfüllt) das true zurückgibt, wenn das erste Argument kleiner als das zweite ist.Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein:
Während die Signatur nicht |
Rückgabewert
std::pair<const T&, const T&>(a, b) zurück, wenn a < b oder wenn a äquivalent zu b ist. Gibt das Ergebnis von std::pair<const T&, const T&>(b, a) zurück, wenn b < a.ilist als erstem Element und dem größten als zweitem. Wenn mehrere Elemente äquivalent zum kleinsten sind, wird das am weitesten links stehende solche Element zurückgegeben. Wenn mehrere Elemente äquivalent zum größten sind, wird das am weitesten rechts stehende solche Element zurückgegeben.Komplexität
operator<.comp.ilist.size():| 3N |
| 2 |
operator<.| 3N |
| 2 |
comp.Mögliche Implementierung
| 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);
}
|
Hinweise
Für Überladungen (1,2): Wenn einer der Parameter ein Temporärwert ist, wird die zurückgegebene Referenz am Ende des vollständigen Ausdrucks, der den Aufruf von minmax enthält, zu einer hängenden Referenz:
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
Beispiel
#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';
}
Mögliche Ausgabe:
v[2,7]: 4 1 5 9 2
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Richtiges Verhalten |
|---|---|---|---|
| LWG 2239 | C++11 | T musste LessThanComparable sein für Überladungen (2,4)
|
nicht erforderlich |
Siehe auch
| gibt den kleineren der gegebenen Werte zurück (Funktionsvorlage & Algorithmusfunktionsobjekt) | |
(C++20) |
|
| gibt den größeren der gegebenen Werte zurück (Funktionsvorlage & Algorithmusfunktionsobjekt) | |
(C++20) |
|
(C++11) |
gibt die kleinsten und größten Elemente in einem Bereich zurück (Funktionsvorlage & Algorithmusfunktionsobjekt) |
(C++20) |
|
(C++20) |
gibt das kleinere und das größere von zwei Elementen zurück (Algorithmusfunktionsobjekt) |