Namespaces
Variants

std::minmax

Aus de.cppreference.net
 
 
Algorithmenbibliothek
Eingeschränkte Algorithmen und Algorithmen auf Bereichen (C++20)
Eingeschränkte Algorithmen, z. B. ranges::copy, ranges::sort, ...
Nicht modifizierende Sequenzoperationen    
Stapeloperationen
(C++17)
Suchoperationen
Modifizierende Sequenzoperationen
Kopieroperationen
(C++11)
(C++11)
Swap-Operationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Sample-Operationen
(C++17)

Sortier- und verwandte Operationen
Partitionierungsoperationen
(C++11)    

Sortieroperationen
Binäre Suchoperationen
(auf partitionierten Bereichen)
Mengenoperationen (auf sortierten Bereichen)
Mischoperationen (auf sortierten Bereichen)
Heap-Operationen
Minimum/Maximum-Operationen
(C++11)
(C++17)
Lexikografische Vergleichsoperationen
Permutationsoperationen


 
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.

1,2) Gibt Referenzen auf den kleineren und den größeren von 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 den kleinsten und den größten 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.

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:

bool cmp(const Type1& a, const Type2& b);

Während die Signatur nicht const& enthalten muss, darf die Funktion die ihr übergebenen Objekte nicht verändern und muss in der Lage sein, alle Werte des Typs (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie zu akzeptieren (daher ist Type1& nicht erlaubt, ebenso wenig Type1, es sei denn, für Type1 ist eine Verschiebung äquivalent zu einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so sein, dass ein Objekt des Typs T implizit in beide konvertiert werden kann.

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 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

1) Genau ein Vergleich mit operator<.
2) Genau eine Anwendung der Vergleichsfunktion comp.
3,4) Gegeben N als ilist.size():
3) Höchstens
3N
2
Vergleiche mit operator<.
4) Höchstens
3N
2
Anwendungen der Vergleichsfunktion 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)
gibt den größeren der gegebenen Werte zurück
(Funktionsvorlage & Algorithmusfunktionsobjekt)
gibt die kleinsten und größten Elemente in einem Bereich zurück
(Funktionsvorlage & Algorithmusfunktionsobjekt)
gibt das kleinere und das größere von zwei Elementen zurück
(Algorithmusfunktionsobjekt)