std::sort_heap
| ヘッダ <algorithm>
|
||
template< class RandomIt >
void sort_heap( RandomIt first, RandomIt last );
|
で定義 (1) | (constexpr C++20以降) |
template< class RandomIt, class Compare >
void sort_heap( RandomIt first, RandomIt last, Compare comp );
|
(2) | (constexpr C++20以降) |
ヒープ [first, last)をソート済み範囲に変換します。ヒープのプロパティは維持されなくなります。
operator<(C++20まで)std::less{}(C++20以降) に関して定義され、operator<(C++20まで)std::less{}(C++20以降) に関してソートされます。comp に関して定義され、comp に関してソートされます。次の条件のいずれかが満たされる場合、動作は未定義です:
[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++20) |
|
(C++11) |
最大ヒープである最大の部分範囲を探す (関数テンプレート & アルゴリズム関数オブジェクト) |
(C++20) |
|
| 要素の範囲から最大ヒープを作成する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 最大ヒープから最大の要素を削除する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 最大ヒープに要素を追加する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++20) |
最大ヒープを要素のソートされた範囲に変換する (アルゴリズム関数オブジェクト) |