Namespaces
Variants

std::minmax_element

Von de.cppreference.net
 
 
Algorithmen-Bibliothek
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)
Tauschoperationen
Transformationsoperationen
Erzeugungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(C++17)

Sortier- und zugehörige Operationen
Partitionierungsoperationen
(C++11)    

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


 
Definiert in Header <algorithm>
template< class ForwardIt >
std::pair<ForwardIt, ForwardIt>
    minmax_element( ForwardIt first, ForwardIt last );
(1) (seit C++11)
(constexpr seit C++17)
template< class ExecutionPolicy, class ForwardIt >
std::pair<ForwardIt, ForwardIt>
    minmax_element( ExecutionPolicy&& policy,
                    ForwardIt first, ForwardIt last );
(2) (seit C++17)
template< class ForwardIt, class Compare >
std::pair<ForwardIt, ForwardIt>
    minmax_element( ForwardIt first, ForwardIt last, Compare comp );
(3) (seit C++11)
(constexpr seit C++17)
template< class ExecutionPolicy, class ForwardIt, class Compare >
std::pair<ForwardIt, ForwardIt>
    minmax_element( ExecutionPolicy&& policy,
                    ForwardIt first, ForwardIt last, Compare comp );
(4) (seit C++17)

Findet das kleinste und das größte Element im Bereich [first, last).

1) Elemente werden verglichen mit operator<(bis C++20)std::less{}(seit C++20).
3) Elemente werden verglichen mit der Vergleichsfunktion comp.
2,4) Wie (1,3), aber ausgeführt gemäß policy.
Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn der Wert des folgenden Ausdrucks true ist:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(bis C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(seit C++20)

Parameter

first, last - das Paar von Iteratoren, die den Bereich der zu untersuchenden Elemente definieren
policy - die zu verwendende Ausführungsrichtlinie
cmp - Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von Compare erfüllt) welches 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 kein const& haben muss, darf die Funktion die ihr übergebenen Objekte nicht ä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, noch ist Type1 erlaubt, es sei denn, für Type1 ist eine Verschiebung gleichbedeutend mit einer Kopie(seit C++11)).
Die Typen Type1 und Type2 müssen so sein, dass ein Objekt des Typs ForwardIt dereferenziert und dann implizit in beide konvertiert werden kann.

Typanforderungen
-
ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen.

Rückgabewert

ein Paar bestehend aus einem Iterator auf das kleinste Element als erstes Element und einem Iterator auf das größte Element als zweites. Gibt std::make_pair(first, first) zurück, wenn der Bereich leer ist. Wenn mehrere Elemente äquivalent zum kleinsten Element sind, wird der Iterator auf das erste solche Element zurückgegeben. Wenn mehrere Elemente äquivalent zum größten Element sind, wird der Iterator auf das letzte solche Element zurückgegeben.

Komplexität

Gegeben N als std::distance(first, last):

1,2) Höchstens max(⌊
3
2
(N-1)⌋,0)
Vergleiche mit operator<(bis C++20)std::less{}(seit C++20).
3,4) Höchstens max(⌊
3
2
(N-1)⌋,0)
Anwendungen der Vergleichsfunktion comp.

Ausnahmen

Die Überladungen mit einem Template-Parameter namens ExecutionPolicy melden Fehler wie folgt:

  • Wenn die Ausführung einer als Teil des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jedes andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus Speicher nicht zuweisen kann, wird std::bad_alloc ausgelöst.

Mögliche Implementierung

minmax_element
template<class ForwardIt>
std::pair<ForwardIt, ForwardIt>
    minmax_element(ForwardIt first, ForwardIt last)
{
    using value_type = typename std::iterator_traits<ForwardIt>::value_type;
    return std::minmax_element(first, last, std::less<value_type>());
}
minmax_element
template<class ForwardIt, class Compare>
std::pair<ForwardIt, ForwardIt>
    minmax_element(ForwardIt first, ForwardIt last, Compare comp)
{
    auto min = first, max = first;
    
    if (first == last || ++first == last)
        return {min, max};
    
    if (comp(*first, *min))
        min = first;
    else
        max = first;
    
    while (++first != last)
    {
        auto i = first;
        if (++first == last)
        {
            if (comp(*i, *min))
                min = i;
            else if (!(comp(*i, *max)))
                max = i;
            break;
        }
        else
        {
            if (comp(*first, *i))
            {
                if (comp(*first, *min))
                    min = first;
                if (!(comp(*i, *max)))
                    max = i;
            }
            else
            {
                if (comp(*i, *min))
                    min = i;
                if (!(comp(*first, *max)))
                    max = first;
            }
        }
    }
    return {min, max};
}

Hinweise

Dieser Algorithmus unterscheidet sich von std::make_pair(std::min_element(), std::max_element()), nicht nur in der Effizienz, sondern auch darin, dass dieser Algorithmus das letzte größte Element findet, während std::max_element das erste größte Element findet.

Beispiel

#include <algorithm>
#include <iostream>
 
int main()
{
    const auto v = {3, 9, 1, 4, 2, 5, 9};
    const auto [min, max] = std::minmax_element(begin(v), end(v));

    std::cout << "min = " << *min << ", max = " << *max << '\n';
}

Ausgabe:

min = 1, max = 9

Siehe auch

gibt das kleinste Element in einem Bereich zurück
(Funktionstemplate & Algorithmus-Funktionsobjekt)
gibt das größte Element in einem Bereich zurück
(Funktionstemplate & Algorithmus-Funktionsobjekt)
gibt die kleinsten und größten Elemente in einem Bereich zurück
(Algorithmus-Funktionsobjekt)