std::ranges::sort_heap
| Definiert in Header <algorithm> |
||
| Aufruf-Signatur |
||
| template< std::random_access_iterator I, std::sentinel_for<I> S, class Comp = ranges::less, class Proj = std::identity > |
(1) | (seit C++20) |
| template< ranges::random_access_range R, class Comp = ranges::less, class Proj = std::identity > |
(2) | (seit C++20) |
Sortiert die Elemente im angegebenen Bereich in Bezug auf comp und proj, wobei der Bereich ursprünglich einen Heap in Bezug auf comp und proj darstellt. Der sortierte Bereich behält die Heap-Eigenschaft nicht mehr bei.
[first, last).Wenn der angegebene Bereich kein Heap in Bezug auf comp und proj ist, ist das Verhalten undefiniert.
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 zu modifizierenden Bereich definiert |
| r | - | Der Bereich der zu ändernden Elemente |
| comp | - | Comparator, der auf die projizierten Elemente angewendet werden soll |
| proj | - | Projektion, die auf die Elemente angewendet wird |
[bearbeiten] Rückgabewert
[bearbeiten] Komplexität
Höchstens 2N⋅log(N) Anwendungen von comp und 4N⋅log(N) Anwendungen von proj, wobei N die ist
[bearbeiten] Mögliche Implementierung
struct sort_heap_fn { template<std::random_access_iterator I, std::sentinel_for<I> S, class Comp = ranges::less, class Proj = std::identity> requires std::sortable<I, Comp, Proj> constexpr I operator()(I first, S last, Comp comp = {}, Proj proj = {}) const { auto ret{ranges::next(first, last)}; for (; first != last; --last) ranges::pop_heap(first, last, comp, proj); return ret; } template<ranges::random_access_range R, class Comp = ranges::less, class Proj = std::identity> requires std::sortable<ranges::iterator_t<R>, Comp, Proj> constexpr ranges::borrowed_iterator_t<R> operator()(R&& r, Comp comp = {}, Proj proj = {}) const { return (*this)(ranges::begin(r), ranges::end(r), std::move(comp), std::move(proj)); } }; inline constexpr sort_heap_fn sort_heap{}; |
[bearbeiten] Beispiel
#include <algorithm> #include <array> #include <iostream> void print(auto const& rem, const auto& v) { std::cout << rem; for (const auto i : v) std::cout << i << ' '; std::cout << '\n'; } int main() { std::array v{3, 1, 4, 1, 5, 9}; print("original array: ", v); std::ranges::make_heap(v); print("after make_heap: ", v); std::ranges::sort_heap(v); print("after sort_heap: ", v); }
Ausgabe
original array: 3 1 4 1 5 9 after make_heap: 9 5 4 1 1 3 after sort_heap: 1 1 3 4 5 9
[bearbeiten] Siehe auch
| (C++20) |
Prüft, ob der gegebene Bereich ein Max-Heap ist (Algorithmus-Funktionsobjekt) |
| (C++20) |
Findet den größten Teilbereich, der ein Max-Heap ist (Algorithmus-Funktionsobjekt) |
| (C++20) |
Erstellt aus einem Bereich von Elementen einen Max-Heap (Algorithmus-Funktionsobjekt) |
| (C++20) |
Entfernt das größte Element aus einem Max-Heap (Algorithmus-Funktionsobjekt) |
| (C++20) |
Fügt ein Element zu einem Max-Heap hinzu (Algorithmus-Funktionsobjekt) |
| Verwandelt einen Max-Heap in einen aufsteigend sortierten Bereich von Elementen (Funktionstemplate) |