template
<
class
T,
class
Container
=
std::
vector
<
T
>
,
class
Compare
=
std::
less
<
typename
Container
::
value_type
>
>
class
priority_queue
;
|
|
|
|
|
|
|
優先度付きキューは、対数時間での挿入と抽出を犠牲にして、(デフォルトでは)最大要素の定数時間検索を提供する
コンテナアダプタ
です。
ユーザー提供の
Compare
を指定して順序を変更できます。例えば
std::
greater
<
T
>
を使用すると、最小要素が
top()
として表示されるようになります。
priority_queueを扱うことは、何らかのランダムアクセスコンテナ内の
heap
を管理するのと似ていますが、ヒープを誤って無効化してしまうことがないという利点があります。
std::priority_queueのすべてのメンバー関数は
std::priority_queue
です:定数式の評価において
std::priority_queue
オブジェクトを作成して使用することが可能です。
ただし、
std::priority_queue
オブジェクトは一般的に
constexpr
にはできません。なぜなら、動的に割り当てられたストレージは同じ定数式の評価内で解放されなければならないからです。
|
(C++26以降)
|
|
目次
テンプレートパラメータ
メンバ型
| メンバ
|
定義
|
container_type
|
Container
|
value_compare
|
Compare
|
value_type
|
Container::value_type
|
size_type
|
Container::size_type
|
reference
|
Container::reference
|
const_reference
|
Container::const_reference
|
メンバオブジェクト
| メンバ
|
説明
|
|
|
内部コンテナ (プロテクテッドメンバオブジェクト)
|
|
|
比較関数オブジェクト (プロテクテッドメンバオブジェクト)
|
メンバー関数
|
|
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)
|
|
|
要素の範囲を挿入し、基盤となるコンテナをソートする
(public member function)
|
|
|
要素をその場で構築し、基盤となるコンテナをソートする
(public member function)
|
|
|
先頭要素を削除する
(public member function)
|
|
|
内容を交換する
(public member function)
|
非メンバー関数
ヘルパークラス
注記
例
#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
は比較関数オブジェクトを受け取るが、
そのメンバー型定義が欠落
|
追加
|
関連項目
|
|
サイズ変更可能な連続配列
(クラステンプレート)
|
|
|
省スペースな動的ビットセット
(クラステンプレート特殊化)
|
|
|
両端キュー
(クラステンプレート)
|
|