std:: sort_heap
|
ヘッダーで定義
<algorithm>
|
||
|
template
<
class
RandomIt
>
void sort_heap ( RandomIt first, RandomIt last ) ; |
(1) | (C++20以降 constexpr) |
|
template
<
class
RandomIt,
class
Compare
>
void sort_heap ( RandomIt first, RandomIt last, Compare comp ) ; |
(2) | (C++20以降 constexpr) |
ヒープ
ヒープ
[
first
,
last
)
をソート済み範囲に変換します。ヒーププロパティは維持されなくなります。
以下のいずれかの条件が満たされる場合、動作は未定義です:
-
[first,last)はヒープではありません。
|
(C++11以前) |
|
(C++11以降) |
目次 |
パラメータ
| first, last | - | バイナリヒープを定義するイテレータのペアで、ソートされた範囲を作成する要素の 範囲 を定義する |
| comp | - |
比較関数オブジェクト(つまり、
Compare
の要件を満たすオブジェクト)。最初の引数が2番目の引数より
小さい
場合に
true
を返す。
比較関数のシグネチャは以下と同等であるべき: bool cmp ( const Type1 & a, const Type2 & b ) ;
シグネチャが
const
&
を持つ必要はないが、関数は渡されたオブジェクトを変更してはならず、
値カテゴリ
に関係なく型(おそらくconstの)
|
| 型の要件 | ||
-
RandomIt
は
LegacyRandomAccessIterator
の要件を満たさなければならない。
|
||
-
Compare
は
Compare
の要件を満たさなければならない。
|
||
計算量
与えられた N を std:: distance ( first, last ) として:
実装例
| 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); } |
例
#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); }
出力:
after make_heap, v: 9 4 5 1 1 3 after sort_heap, v: 1 1 3 4 5 9
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2444 | C++98 | 最大 N⋅log(N) 回の比較が許可されていた | 2N⋅log(N) に増加 |
関連項目
|
(C++11)
|
指定された範囲が最大ヒープであるかどうかをチェックする
(関数テンプレート) |
|
(C++11)
|
最大ヒープである最大の部分範囲を見つける
(関数テンプレート) |
|
要素の範囲から最大ヒープを作成する
(関数テンプレート) |
|
|
最大ヒープから最大要素を削除する
(関数テンプレート) |
|
|
要素を最大ヒープに追加する
(関数テンプレート) |
|
|
(C++20)
|
最大ヒープを昇順にソートされた要素の範囲に変換する
(アルゴリズム関数オブジェクト) |