Namespaces
Variants

std::max_element

Von 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
Generierungsoperationen
Entfernungsoperationen
Reihenfolgeändernde Operationen
(bis C++17)(C++11)
(C++20)(C++20)
Stichprobenoperationen
(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


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

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

1) Die Elemente werden mit operator<(bis C++20)std::less{}(seit C++20) verglichen.
3) Die Elemente werden mit der Vergleichsfunktion comp verglichen.
2,4) Wie (1,3), aber gemäß policy ausgeführt.
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, das den Bereich der zu untersuchenden Elemente definiert
policy - die Ausführungsstrategie zur Verwendung
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 wie folgt sein:

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

Die Signatur muss nicht const& enthalten, die Funktion darf die übergebenen Objekte nicht ändern und muss alle Werte des Typs (möglicherweise const) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren können (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 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

Iterator zum größten Element im Bereich [first, last). Wenn mehrere Elemente im Bereich dem größten Element äquivalent sind, wird der Iterator zum ersten dieser Elemente zurückgegeben. Gibt last zurück, wenn der Bereich leer ist.

Komplexität

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

1,2) Genau max(N-1,0) Vergleiche mit operator<(bis C++20)std::less{}(seit C++20).
3,4) Genau max(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 im Rahmen des Algorithmus aufgerufenen Funktion eine Ausnahme auslöst und ExecutionPolicy eine der Standardstrategien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsdefiniert.
  • Wenn der Algorithmus keinen Speicher zuweisen kann, wird std::bad_alloc ausgelöst.

Mögliche Implementierung

max_element (1)
template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
    if (first == last)
        return last;
    
    ForwardIt largest = first;
    
    while (++first != last)
        if (*largest < *first)
            largest = first;
    
    return largest;
}
max_element (3)
template<class ForwardIt, class Compare>
ForwardIt max_element(ForwardIt first, ForwardIt last, Compare comp)
{
    if (first == last)
        return last;
    
    ForwardIt largest = first;
    
    while(++first != last)
        if (comp(*largest, *first))
            largest = first;
    
    return largest;
}

Beispiel

#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v{3, 1, -14, 1, 5, 9, -14, 9};
    std::vector<int>::iterator result;
    
    result = std::max_element(v.begin(), v.end());
    std::cout << "Max element found at index "
              << std::distance(v.begin(), result)
              << " has value " << *result << '\n';
    
    result = std::max_element(v.begin(), v.end(), [](int a, int b)
    {
        return std::abs(a) < std::abs(b);
    });
    std::cout << "Absolute max element found at index "
              << std::distance(v.begin(), result)
              << " has value " << *result << '\n';
}

Ausgabe:

Max element found at index 5 has value 9
Absolute max element found at index 2 has value -14

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden auf zuvor veröffentlichte C++-Standards retroaktiv angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Richtiges Verhalten
LWG 212 C++98 der Rückgabewert wurde nicht angegeben, wenn [first, last) leer ist gibt last in diesem Fall zurück
LWG 2150 C++98 der Iterator zum ersten nicht-kleinsten Element wurde zurückgegeben Rückgabewert korrigiert

Siehe auch

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