std::minmax_element
| 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).
operator<(bis C++20)std::less{}(seit C++20).comp.policy.true ist:
|
|
(bis C++20) |
|
|
(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:
Während die Signatur kein |
| 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):
| 3 |
| 2 |
operator<(bis C++20)std::less{}(seit C++20).| 3 |
| 2 |
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
ExecutionPolicyeine der Standardrichtlinien ist, wird std::terminate aufgerufen. Für jedes andereExecutionPolicyist 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) | |
(C++20) |
|
| gibt das größte Element in einem Bereich zurück (Funktionstemplate & Algorithmus-Funktionsobjekt) | |
(C++20) |
|
(C++20) |
gibt die kleinsten und größten Elemente in einem Bereich zurück (Algorithmus-Funktionsobjekt) |