Namespaces
Variants

std:: minmax_element

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
minmax_element
(C++11)

Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
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 größte Element im Bereich [ first , last ) .

1) Elemente werden verglichen mit operator < (bis C++20) std:: less { } (seit C++20) .
3) Elemente werden mit der Vergleichsfunktion comp verglichen.
2,4) Gleich wie (1,3) , aber ausgeführt gemäß policy .
Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> ist true .

(bis C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> ist true .

(seit C++20)

Inhaltsverzeichnis

Parameter

first, last - das Paar von Iteratoren, das den Bereich der zu untersuchenden Elemente definiert
policy - die zu verwendende Ausführungsrichtlinie
cmp - 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 Folgender sein:

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

Obwohl die Signatur nicht const & benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren können (daher ist Type1 & nicht erlaubt , ebenso wenig wie 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 beschaffen sein, dass ein Objekt vom Typ 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 zum kleinsten Element als erstes Element und einem Iterator zum größten Element als zweites Element. Gibt std:: make_pair ( first, first ) zurück, wenn der Bereich leer ist. Wenn mehrere Elemente dem kleinsten Element entsprechen, wird der Iterator zum ersten solchen Element zurückgegeben. Wenn mehrere Elemente dem größten Element entsprechen, wird der Iterator zum letzten solchen Element zurückgegeben.

Komplexität

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

1,2) Höchstens max(⌊
3
2
(N-1)⌋,0)
Vergleiche unter Verwendung von 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 Exception wirft und ExecutionPolicy einer der Standard-Policies ist, wird std::terminate aufgerufen. Für jeden anderen ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher allokieren kann, wird std::bad_alloc geworfen.

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
(Funktions-Template)
gibt das größte Element in einem Bereich zurück
(Funktions-Template)
gibt das kleinste und das größte Element in einem Bereich zurück
(Algorithmus-Funktionsobjekt)