std::minmax
| Definiert 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, |
(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, |
(4) | (seit C++11) (constexpr seit C++14) |
Gibt die kleinsten und die größten der gegebenen Werte zurück.
T nicht LessThanComparable ist, ist das Verhalten undefiniert.T nicht LessThanComparable ist, ist das Verhalten undefiniert.Inhalt |
[edit] Parameter
| a, b | - | die zu vergleichenden Werte |
| ilist | - | Initialisierungsliste mit den zu vergleichenden Werten |
| comp | - | Ein Vergleichsfunktions-Objekt (d.h. ein Objekt, das die Anforderungen an Compare erfüllt), das true zurückgibt, wenn das erste Argument *weniger* als das zweite ist. Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein bool cmp(const Type1& a, const Type2& b); Obwohl die Signatur nicht const& haben muss, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte vom Typ (möglicherweise const) |
[edit] Rückgabewert
[edit] Komplexität
| 3N |
| 2 |
| 3N |
| 2 |
[edit] Mögliche Implementierung
| minmax (1) |
|---|
| minmax (2) |
| 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); } |
[edit] Hinweise
Bei den Überladungen (1,2), wenn einer der Parameter ein temporäres Objekt 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
[edit] 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
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2239 | C++11 | T war für die Überladungen (2,4) als LessThanComparable erforderlich. |
nicht erforderlich. |
[edit] Siehe auch
| Gibt den kleineren der beiden Werte zurück (Funktionstemplate) | |
| Gibt den größeren der beiden Werte zurück (Funktionstemplate) | |
| (C++11) |
gibt das kleinste und das größte Element in einem Bereich zurück (Funktionsvorlage) |
| (C++20) |
gibt die kleinere und größere von zwei Elementen zurück (Algorithmus-Funktionsobjekt) |