std:: priority_queue
|
ヘッダーで定義
<queue>
|
||
|
template
<
class
T,
|
||
優先度付きキューは、対数時間での挿入と抽出を犠牲にして、(デフォルトでは)最大要素の定数時間検索を提供する コンテナアダプタ です。
ユーザー提供の
Compare
を指定して順序を変更できます。例えば
std::
greater
<
T
>
を使用すると、最小要素が
top()
として表示されるようになります。
priority_queue
を扱うことは、何らかのランダムアクセスコンテナ内の
heap
を管理するのと似ていますが、ヒープを誤って無効化してしまうことがないという利点があります。
std::priority_queueのすべてのメンバー関数は
std::priority_queue
です:定数式の評価において
std::priority_queue
オブジェクトを作成して使用することが可能です。
ただし、
|
(C++26以降) |
目次 |
テンプレートパラメータ
| T | - |
格納される要素の型。
T
が
Container::value_type
と同じ型でない場合、プログラムは不適格である。
|
| Container | - |
要素を格納するために使用される基盤となるコンテナの型。コンテナは
SequenceContainer
の要件を満たさなければならず、そのイテレータは
LegacyRandomAccessIterator
の要件を満たさなければならない。さらに、以下の関数を
通常の意味論
で提供しなければならない:
標準コンテナ
std::vector
(
|
| Compare | - |
狭義の弱順序を提供する
Compare
型。
Compare パラメータは、弱順序において最初の引数が2番目の引数より 前に来る 場合に true を返すように定義されていることに注意。しかし、優先度キューは最大の要素を最初に出力するため、「前に来る」要素は実際には最後に出力される。つまり、キューの先頭には Compare によって課される弱順序において「最後」の要素が含まれる。 |
メンバー型
| メンバー型 | 定義 |
container_type
|
Container
|
value_compare
|
Compare
|
value_type
|
Container::value_type
|
size_type
|
Container :: size_type |
reference
|
Container::reference
|
const_reference
|
Container::const_reference
|
メンバーオブジェクト
| メンバー名 | 定義 |
|
Container
c
|
基となるコンテナ
(protected member object) |
|
Compare
comp
|
比較関数オブジェクト
(protected member object) |
メンバー関数
priority_queue
を構築する
(public member function) |
|
priority_queue
を破棄する
(public member function) |
|
|
コンテナアダプタに値を代入する
(public member function) |
|
要素アクセス |
|
|
先頭要素にアクセスする
(public member function) |
|
容量 |
|
|
コンテナアダプタが空かどうかをチェックする
(public member function) |
|
|
要素数を返す
(public member function) |
|
変更操作 |
|
|
要素を挿入し、基盤となるコンテナをソートする
(public member function) |
|
|
(C++23)
|
要素の範囲を挿入し、基盤となるコンテナをソートする
(public member function) |
|
(C++11)
|
要素をその場で構築し、基盤となるコンテナをソートする
(public member function) |
|
先頭要素を削除する
(public member function) |
|
|
(C++11)
|
内容を交換する
(public member function) |
非メンバー関数
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
ヘルパークラス
|
std::uses_allocator
型特性の特殊化
(クラステンプレートの特殊化) |
|
std::priority_queue
の書式設定サポート
(クラステンプレートの特殊化) |
推論ガイド |
(C++17以降) |
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | レンジ対応 コンテナの構築と挿入 |
__cpp_lib_constexpr_queue
|
202502L
|
(C++26) |
constexpr
std::priority_queue
|
例
#include <functional> #include <iostream> #include <queue> #include <string_view> #include <vector> template<typename T> void pop_println(std::string_view rem, T& pq) { std::cout << rem << ": "; for (; !pq.empty(); pq.pop()) std::cout << pq.top() << ' '; std::cout << '\n'; } template<typename T> void println(std::string_view rem, const T& v) { std::cout << rem << ": "; for (const auto& e : v) std::cout << e << ' '; std::cout << '\n'; } int main() { const auto data = {1, 8, 5, 6, 3, 4, 0, 9, 7, 2}; println("data", data); std::priority_queue<int> max_priority_queue; // 優先度キューを埋める for (int n : data) max_priority_queue.push(n); pop_println("max_priority_queue", max_priority_queue); // std::greater<int> は最大優先度キューを最小優先度キューとして動作させる std::priority_queue<int, std::vector<int>, std::greater<int>> min_priority_queue1(data.begin(), data.end()); pop_println("min_priority_queue1", min_priority_queue1); // 最小優先度キューを定義する2番目の方法 std::priority_queue min_priority_queue2(data.begin(), data.end(), std::greater<int>()); pop_println("min_priority_queue2", min_priority_queue2); // カスタム関数オブジェクトを使用して要素を比較 struct { bool operator()(const int l, const int r) const { return l > r; } } customLess; std::priority_queue custom_priority_queue(data.begin(), data.end(), customLess); pop_println("custom_priority_queue", custom_priority_queue); // ラムダを使用して要素を比較 auto cmp = [](int left, int right) { return (left ^ 1) < (right ^ 1); }; std::priority_queue<int, std::vector<int>, decltype(cmp)> lambda_priority_queue(cmp); for (int n : data) lambda_priority_queue.push(n); pop_println("lambda_priority_queue", lambda_priority_queue); }
出力:
data: 1 8 5 6 3 4 0 9 7 2 max_priority_queue: 9 8 7 6 5 4 3 2 1 0 min_priority_queue1: 0 1 2 3 4 5 6 7 8 9 min_priority_queue2: 0 1 2 3 4 5 6 7 8 9 custom_priority_queue: 0 1 2 3 4 5 6 7 8 9 lambda_priority_queue: 8 9 6 7 4 5 2 3 0 1
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 307 | C++98 |
Container
は
std::vector<bool>
ではなかった
|
許可 |
| LWG 2566 | C++98 |
Container::value_type
の要件が欠落
|
T
が
Container::value_type
と同じ型でない場合は不適格
|
| LWG 2684 | C++98 |
priority_queue
は比較関数オブジェクトを受け取るが、
そのメンバー型定義が欠落 |
追加 |
関連項目
|
サイズ変更可能な連続配列
(クラステンプレート) |
|
|
省スペースな動的ビットセット
(クラステンプレート特殊化) |
|
|
両端キュー
(クラステンプレート) |