std::minmax_element
| Definiert in Header <algorithm> |
||
template< class ForwardIt > std::pair<ForwardIt, ForwardIt> |
(1) | (seit C++11) (constexpr seit C++17) |
| template< class ExecutionPolicy, class ForwardIt > std::pair<ForwardIt, ForwardIt> |
(2) | (seit C++17) |
template< class ForwardIt, class Compare > std::pair<ForwardIt, ForwardIt> |
(3) | (seit C++11) (constexpr seit C++17) |
| template< class ExecutionPolicy, class ForwardIt, class Compare > std::pair<ForwardIt, ForwardIt> |
(4) | (seit C++17) |
Findet das kleinste und das größte Element im Bereich [first, last).
|
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 |
| cmp | - | 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) |
| Typanforderungen | ||
-ForwardIt muss die Anforderungen von LegacyForwardIterator erfüllen. | ||
[edit] Rückgabewert
Ein Paar, das einen Iterator zum kleinsten Element als erstes Element und einen Iterator zum größten Element als zweites Element enthält. Gibt std::make_pair(first, first) zurück, wenn der Bereich leer ist. Wenn mehrere Elemente dem kleinsten Element entsprechen, wird der Iterator auf das erste solche Element zurückgegeben. Wenn mehrere Elemente dem größten Element entsprechen, wird der Iterator auf das letzte solche Element zurückgegeben.
[edit] Komplexität
Gegeben sei N als std::distance(first, last).
| 3 |
| 2 |
[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
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jede andereExecutionPolicyist das Verhalten implementierungsabhängig. - Wenn dem Algorithmus der Speicher zur Neuzuweisung fehlt, wird std::bad_alloc ausgelöst.
[edit] 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}; } |
[edit] Hinweise
Dieser Algorithmus unterscheidet sich von std::make_pair(std::min_element(), std::max_element()) nicht nur in Bezug auf die Effizienz, sondern auch darin, dass dieser Algorithmus das *letzte* größte Element findet, während std::max_element das *erste* größte Element findet.
[edit] 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
[edit] Siehe auch
| gibt das kleinste Element in einem Bereich zurück (Funktionsvorlage) | |
| Gibt das größte Element in einem Bereich zurück (Funktionstemplate) | |
| (C++20) |
gibt das kleinste und das größte Element in einem Bereich zurück (Algorithmus-Funktionsobjekt) |