std::ranges::max_element
Von cppreference.com
| 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) |
1) Findet das größte Element im Bereich
[first, last).2) Dasselbe wie (1), aber verwendet r als Quellbereich, als ob ranges::begin(r) als first und ranges::end(r) als last verwendet würden.
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
Iterator auf das größte Element im Bereich [first, last). Wenn mehrere Elemente im Bereich gleich dem größten Element sind, wird der Iterator auf das erste solche Element zurückgegeben. Gibt last zurück, wenn der Bereich leer ist (d. h. wenn first == last).
[bearbeiten] Komplexität
Genau max(N - 1, 0) Vergleiche, wobei N = ranges::distance(first, last).
[bearbeiten] Mögliche Implementierung
struct max_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 I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const { if (first == last) return last; auto largest = first; while (++first != last) if (std::invoke(comp, std::invoke(proj, *largest), std::invoke(proj, *first))) largest = first; return largest; } 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::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 max_element_fn max_element; |
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <algorithm> #include <cmath> #include <iostream> int main() { namespace ranges = std::ranges; const auto v = {3, 1, -14, 1, 5, 9, -14, 9}; auto result = ranges::max_element(v.begin(), v.end()); std::cout << "Max element at pos " << ranges::distance(v.begin(), result) << '\n'; auto abs_compare = [](int a, int b) { return std::abs(a) < std::abs(b); }; result = ranges::max_element(v, abs_compare); std::cout << "Absolute max element at pos " << ranges::distance(v.begin(), result) << '\n'; }
Ausgabe
Max element at pos 5 Absolute max element at pos 2
[bearbeiten] Siehe auch
| (C++20) |
gibt das kleinste Element in einem Bereich zurück (Algorithmus-Funktionsobjekt) |
| (C++20) |
gibt das kleinste und das größte Element in einem Bereich zurück (Algorithmus-Funktionsobjekt) |
| (C++20) |
Gibt den größeren der beiden Werte zurück (Algorithmus-Funktionsobjekt) |
| Gibt das größte Element in einem Bereich zurück (Funktionstemplate) |