Namensräume
Varianten
Aktionen

std::min_element

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
(C++11)
(C++17)
min_element

Lexikographische Vergleichsoperationen
Permutationsoperationen
C-Bibliothek
Numerische Operationen
Operationen auf uninitialisiertem Speicher
 
Definiert in Header <algorithm>
template< class ForwardIt >
ForwardIt min_element( ForwardIt first, ForwardIt last );
(1) (constexpr seit C++17)
template< class ExecutionPolicy, class ForwardIt >

ForwardIt min_element( ExecutionPolicy&& policy,

                       ForwardIt first, ForwardIt last );
(2) (seit C++17)
template< class ForwardIt, class Compare >

ForwardIt min_element( ForwardIt first, ForwardIt last,

                       Compare comp );
(3) (constexpr seit C++17)
template< class ExecutionPolicy, class ForwardIt, class Compare >

ForwardIt min_element( ExecutionPolicy&& policy,
                       ForwardIt first, ForwardIt last,

                       Compare comp );
(4) (seit C++17)

Findet das kleinste Element im Bereich [firstlast).

1) Elemente werden mittels operator<(bis C++20)std::less{}(seit C++20) verglichen.
3) Elemente werden mittels der Vergleichsfunktion comp verglichen.
2,4) Dasselbe wie (1,3), aber ausgeführt gemäß policy.
Diese Überladungen nehmen an der Auflösungsauflösung teil, nur 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)

Inhalt

[edit] Parameter

first, last - das Iteratorenpaar, das den Bereich der zu untersuchenden Elemente definiert
policy - die Ausführungsrichtlinie, die verwendet werden soll
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 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.

[edit] Rückgabewert

Iterator auf das kleinste Element im Bereich [firstlast). Wenn mehrere Elemente im Bereich gleich dem kleinsten Element sind, wird der Iterator auf das erste solche Element zurückgegeben. Gibt last zurück, wenn der Bereich leer ist.

[edit] Komplexität

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

1,2) Genau max(N-1,0) Vergleiche mittels operator<(bis C++20)std::less{}(seit C++20).
3,4) Genau max(N-1,0) Aufrufe der Vergleichsfunktion comp.

[edit] Ausnahmen

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

  • Wenn die Ausführung einer Funktion, die als Teil des Algorithmus aufgerufen wird, eine Ausnahme auslöst und ExecutionPolicy eine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andere ExecutionPolicy ist das Verhalten implementierungsabhängig.
  • Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.

[edit] Mögliche Implementierung

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

[edit] Beispiel

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v{3, 1, -4, 1, 5, 9};
 
    std::vector<int>::iterator result = std::min_element(v.begin(), v.end());
    std::cout << "min element has value " << *result << " and index ["
              << std::distance(v.begin(), result) << "]\n";
}

Ausgabe

min element has value -4 and index [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 212 C++98 der Rückgabewert war nicht spezifiziert, wenn [firstlast) leer ist Gibt in diesem Fall last zurück.
LWG 2150 C++98 der Iterator auf das erste nicht-größte Element wurde zurückgegeben der Rückgabewert wurde korrigiert

[edit] Siehe auch

Gibt das größte Element in einem Bereich zurück
(Funktionstemplate) [edit]
gibt das kleinste und das größte Element in einem Bereich zurück
(Funktionsvorlage) [editieren]
Gibt den kleineren der beiden Werte zurück
(Funktionstemplate) [edit]
gibt das kleinste Element in einem Bereich zurück
(Algorithmus-Funktionsobjekt)[bearbeiten]