Namensräume
Varianten
Aktionen

std::minmax

Von cppreference.com
< cpp‎ | algorithm
 
 
Algorithmenbibliothek
Beschränkte Algorithmen und Algorithmen für Bereiche (C++20)
Beschränkte Algorithmen, z.B. ranges::copy, ranges::sort, ...
Ausführungsrichtlinien (C++17)
Nicht-modifizierende Sequenzoperationen
Stapeloperationen
(C++17)
Suchoperationen
(C++11)                (C++11)(C++11)

Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Tauschoperationen
Transformationsoperationen
Generierungsoperationen
Entfernungsoperationen
Ordnungsändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Zusammenführungsoperationen (auf sortierten Bereichen)
Heapoperationen
Minimum/Maximum-Operationen
minmax
(C++11)
(C++17)
Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
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,

                                      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 die kleinsten und die größten der gegebenen Werte zurück.

1,2) Gibt Referenzen auf den kleineren und den größeren der Werte a und b zurück.
1) Verwendet operator<, um die Werte zu vergleichen.
Wenn T nicht LessThanComparable ist, ist das Verhalten undefiniert.
2) Verwendet die Vergleichsfunktion comp, um die Werte zu vergleichen.
3,4) Gibt das kleinste und das größte der Werte in der Initialisierungsliste ilist zurück.
Wenn ilist.size() null ist oder T nicht CopyConstructible ist, ist das Verhalten undefiniert.
3) Verwendet operator<, um die Werte zu vergleichen.
Wenn T nicht LessThanComparable ist, ist das Verhalten undefiniert.
4) Verwendet die Vergleichsfunktion comp, um die Werte zu vergleichen.

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) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren (daher ist Type1& nicht erlaubt, und auch nicht Type1, es sei denn, für Type1 ist ein Move äquivalent zu einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ T implizit in beide konvertiert werden kann.

[edit] Rückgabewert

1,2) Gibt das Ergebnis von 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.
3,4) Ein Paar mit dem kleinsten Wert in ilist als erstes Element und dem größten als zweites. Wenn mehrere Elemente äquivalent zum kleinsten sind, wird das am weitesten links stehende Element zurückgegeben. Wenn mehrere Elemente äquivalent zum größten sind, wird das am weitesten rechts stehende Element zurückgegeben.

[edit] Komplexität

1) Genau ein Vergleich unter Verwendung von operator<.
2) Genau eine Anwendung der Vergleichsfunktion comp.
3,4) Sei N gleich ilist.size().
3) Höchstens
3N
2
Vergleiche unter Verwendung von operator<.
4) Höchstens
3N
2
Anwendungen der Vergleichsfunktion comp.

[edit] 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);
}

[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) [edit]
Gibt den größeren der beiden Werte zurück
(Funktionstemplate) [edit]
gibt das kleinste und das größte Element in einem Bereich zurück
(Funktionsvorlage) [editieren]
gibt die kleinere und größere von zwei Elementen zurück
(Algorithmus-Funktionsobjekt)[bearbeiten]