std::minmax_element
| Défini dans l'en-tête <algorithm>
|
||
template< class ForwardIt >
std::pair<ForwardIt, ForwardIt>
minmax_element( ForwardIt first, ForwardIt last );
|
(1) | (depuis C++11) (constexpr depuis C++17) |
template< class ExecutionPolicy, class ForwardIt >
std::pair<ForwardIt, ForwardIt>
minmax_element( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last );
|
(2) | (depuis C++17) |
template< class ForwardIt, class Compare >
std::pair<ForwardIt, ForwardIt>
minmax_element( ForwardIt first, ForwardIt last, Compare comp );
|
(3) | (depuis C++11) (constexpr depuis C++17) |
template< class ExecutionPolicy, class ForwardIt, class Compare >
std::pair<ForwardIt, ForwardIt>
minmax_element( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, Compare comp );
|
(4) | (depuis C++17) |
Trouve le plus petit et le plus grand élément dans la plage [first, last).
operator<(jusqu'à C++20)std::less{}(depuis C++20).comp.policy.true :
|
|
(jusqu'à C++20) |
|
|
(depuis C++20) |
Paramètres
| first, last | - | la paire d'itérateurs définissant la plage d'éléments à examiner |
| policy | - | la politique d'exécution à utiliser |
| cmp | - | objet fonction de comparaison (c'est-à-dire un objet qui satisfait aux exigences de Compare) qui renvoie true si le premier argument est inférieur au second.La signature de la fonction de comparaison doit être équivalente à la suivante :
Bien que la signature n'ait pas besoin d'avoir |
| Exigences de type | ||
-ForwardIt doit satisfaire aux exigences de LegacyForwardIterator.
| ||
Valeur de retour
une paire composée d'un itérateur vers le plus petit élément comme premier élément et d'un itérateur vers le plus grand élément comme second élément. Renvoie std::make_pair(first, first) si la plage est vide. Si plusieurs éléments sont équivalents au plus petit élément, l'itérateur vers le premier de ces éléments est renvoyé. Si plusieurs éléments sont équivalents au plus grand élément, l'itérateur vers le dernier de ces éléments est renvoyé.
Complexité
Soit N comme std::distance(first, last):
| 3 |
| 2 |
operator<(jusqu'à C++20)std::less{}(depuis C++20).| 3 |
| 2 |
comp.Exceptions
Les surcharges avec un paramètre de modèle nommé ExecutionPolicy signalent les erreurs comme suit :
- Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que
ExecutionPolicyfait partie des politiques standard, std::terminate est appelé. Pour tout autreExecutionPolicy, le comportement est défini par l'implémentation. - Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levée.
Implémentation possible
| 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};
}
|
Notes
Cet algorithme est différent de std::make_pair(std::min_element(), std::max_element()), non seulement en termes d'efficacité, mais aussi en ce sens qu'il trouve le dernier plus grand élément alors que std::max_element trouve le premier plus grand élément.
Exemple
#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';
}
Sortie :
min = 1, max = 9
Voir aussi
| renvoie le plus petit élément d'une plage (fonction patron & objet fonction d'algorithme) | |
(C++20) |
|
| renvoie le plus grand élément d'une plage (fonction patron & objet fonction d'algorithme) | |
(C++20) |
|
(C++20) |
renvoie le plus petit et le plus grand élément d'une plage (objet fonction d'algorithme) |