std:: sort_heap
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
RandomIt
>
void sort_heap ( RandomIt first, RandomIt last ) ; |
(1) | (constexpr seit C++20) |
|
template
<
class
RandomIt,
class
Compare
>
void sort_heap ( RandomIt first, RandomIt last, Compare comp ) ; |
(2) | (constexpr seit C++20) |
Wandelt den
Heap
[
first
,
last
)
in einen sortierten Bereich um. Die Heap-Eigenschaft wird nicht länger aufrechterhalten.
Wenn eine der folgenden Bedingungen erfüllt ist, ist das Verhalten undefiniert:
-
[first,last)ist kein Heap.
|
(bis C++11) |
|
(seit C++11) |
Inhaltsverzeichnis |
Parameter
| first, last | - | Das Paar von Iteratoren, das den Bereich des binären Heaps definiert, aus dem der sortierte Bereich erstellt werden soll |
| comp | - |
Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von
Compare
erfüllt), das
true
zurückgibt, wenn das erste Argument
kleiner
als das zweite ist.
Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgendem sein: bool cmp ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur nicht
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const)
|
| Typanforderungen | ||
-
RandomIt
muss die Anforderungen von
LegacyRandomAccessIterator
erfüllen.
|
||
-
Compare
muss die Anforderungen von
Compare
erfüllen.
|
||
Komplexität
Gegeben N als std:: distance ( first, last ) :
Mögliche Implementierung
| sort_heap (1) |
|---|
template<class RandomIt> void sort_heap(RandomIt first, RandomIt last) { while (first != last) std::pop_heap(first, last--); } |
| sort_heap (2) |
template<class RandomIt, class Compare> void sort_heap(RandomIt first, RandomIt last, Compare comp) { while (first != last) std::pop_heap(first, last--, comp); } |
`-Tags wurde gemäß den Anforderungen nicht übersetzt. Die Funktionsnamen und C++-spezifischen Begriffe (wie "template", "class", "void", "while") bleiben unverändert.*
Beispiel
#include <algorithm> #include <iostream> #include <string_view> #include <vector> void println(std::string_view fmt, const auto& v) { for (std::cout << fmt; const auto &i : v) std::cout << i << ' '; std::cout << '\n'; } int main() { std::vector<int> v{3, 1, 4, 1, 5, 9}; std::make_heap(v.begin(), v.end()); println("after make_heap, v: ", v); std::sort_heap(v.begin(), v.end()); println("after sort_heap, v: ", v); }
Ausgabe:
after make_heap, v: 9 4 5 1 1 3 after sort_heap, v: 1 1 3 4 5 9
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2444 | C++98 | höchstens N⋅log(N) Vergleiche waren erlaubt | erhöht auf 2N⋅log(N) |
Siehe auch
|
(C++11)
|
prüft, ob der gegebene Bereich einen Max-Heap darstellt
(Funktions-Template) |
|
(C++11)
|
findet den größten Teilbereich, der einen Max-Heap darstellt
(Funktions-Template) |
|
erzeugt einen Max-Heap aus einer Reihe von Elementen
(Funktions-Template) |
|
|
entfernt das größte Element aus einem Max-Heap
(Funktions-Template) |
|
|
fügt ein Element zu einem Max-Heap hinzu
(Funktions-Template) |
|
|
(C++20)
|
wandelt einen Max-Heap in eine aufsteigend sortierte Elementreihe um
(Algorithmus-Funktionsobjekt) |