std::ranges::minmax_element, std::ranges::minmax_element_result
| Definiert in Header <algorithm> |
||
| Aufruf-Signatur |
||
| template< std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less > |
(1) | (seit C++20) |
| template< ranges::forward_range R, class Proj = std::identity, std::indirect_strict_weak_order< |
(2) | (seit C++20) |
| Hilfstypen |
||
| template< class I > using minmax_element_result = ranges::min_max_result<I>; |
(3) | (seit C++20) |
[first, last).Die auf dieser Seite beschriebenen funktionsähnlichen Entitäten sind Algorithmus-Funktionsobjekte (informell als niebloids bekannt), d.h.
- Können explizite Template-Argumentlisten bei keinem von ihnen angegeben werden.
- Keiner von ihnen ist für Argument-abhängige Suche sichtbar.
- Wenn einer von ihnen durch normale unqualifizierte Suche als Name links vom Funktionsaufrufoperator gefunden wird, wird die Argument-abhängige Suche unterdrückt.
Inhalt |
[bearbeiten] Parameter
| first, last | - | das Iterator-Sentinel-Paar, das den Bereich der zu untersuchenden Elemente definiert |
| r | - | Der zu untersuchende Bereich |
| comp | - | Vergleich, der auf die projizierten Elemente angewendet wird |
| proj | - | Projektion, die auf die Elemente angewendet wird. |
[bearbeiten] Rückgabewert
Ein Objekt, das einen Iterator zum kleinsten Element als erstes Element und einen Iterator zum größten Element als zweites Element enthält. Gibt {first, first} zurück, wenn der Bereich leer ist. Wenn mehrere Elemente äquivalent zum kleinsten Element sind, wird der Iterator zum ersten solchen Element zurückgegeben. Wenn mehrere Elemente äquivalent zum größten Element sind, wird der Iterator zum letzten solchen Element zurückgegeben.
[bearbeiten] Komplexität
Höchstens std::max(std::floor(1.5 * (N − 1)), 0.0) Anwendungen des Vergleichs und doppelt so viele Anwendungen der Projektion, wobei N = ranges::distance(first, last).
[bearbeiten] Mögliche Implementierung
struct minmax_element_fn { template<std::forward_iterator I, std::sentinel_for<I> S, class Proj = std::identity, std::indirect_strict_weak_order<std::projected<I, Proj>> Comp = ranges::less> constexpr ranges::minmax_element_result<I> operator()(I first, S last, Comp comp = {}, Proj proj = {}) const { auto min = first, max = first; if (first == last || ++first == last) return {min, max}; if (std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *min))) min = first; else max = first; while (++first != last) { auto i = first; if (++first == last) { if (std::invoke(comp, std::invoke(proj, *i), std::invoke(proj, *min))) min = i; else if (!(std::invoke(comp, std::invoke(proj, *i), std::invoke(proj, *max)))) max = i; break; } else { if (std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *i))) { if (std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *min))) min = first; if (!(std::invoke(comp, std::invoke(proj, *i), std::invoke(proj, *max)))) max = i; } else { if (std::invoke(comp, std::invoke(proj, *i), std::invoke(proj, *min))) min = i; if (!(std::invoke(comp, std::invoke(proj, *first), std::invoke(proj, *max)))) max = first; } } } return {min, max}; } template<ranges::forward_range R, class Proj = std::identity, std::indirect_strict_weak_order< std::projected<ranges::iterator_t<R>, Proj>> Comp = ranges::less> constexpr ranges::minmax_element_result<ranges::borrowed_iterator_t<R>> operator()(R&& r, Comp comp = {}, Proj proj = {}) const { return (*this)(ranges::begin(r), ranges::end(r), std::ref(comp), std::ref(proj)); } }; inline constexpr minmax_element_fn minmax_element; |
[bearbeiten] Beispiel
#include <algorithm> #include <iostream> #include <iterator> namespace ranges = std::ranges; int main() { const auto v = {3, 9, 1, 4, 1, 2, 5, 9}; const auto [min, max] = ranges::minmax_element(v); std::cout << "min = " << *min << ", at [" << ranges::distance(v.begin(), min) << "]\n" << "max = " << *max << ", at [" << ranges::distance(v.begin(), max) << "]\n"; }
Ausgabe
min = 1, at [2] max = 9, at [7]
[bearbeiten] Siehe auch
| (C++20) |
gibt das kleinste Element in einem Bereich zurück (Algorithmus-Funktionsobjekt) |
| (C++20) |
Gibt das größte Element in einem Bereich zurück (Algorithmus-Funktionsobjekt) |
| (C++20) |
gibt die kleinere und größere von zwei Elementen zurück (Algorithmus-Funktionsobjekt) |
| (C++11) |
gibt das kleinste und das größte Element in einem Bereich zurück (Funktionsvorlage) |