Namespaces
Variants

std:: priority_queue

From cppreference.net
ヘッダーで定義 <queue>
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以降)

目次

テンプレートパラメータ

T - 格納される要素の型。 T Container::value_type と同じ型でない場合、プログラムは不適格である。
Container - 要素を格納するために使用される基盤となるコンテナの型。コンテナは SequenceContainer の要件を満たさなければならず、そのイテレータは LegacyRandomAccessIterator の要件を満たさなければならない。さらに、以下の関数を 通常の意味論 で提供しなければならない:

標準コンテナ std::vector std::vector<bool> を除く)および std::deque はこれらの要件を満たす。

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)

非メンバー関数

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 は比較関数オブジェクトを受け取るが、
そのメンバー型定義が欠落
追加

関連項目

サイズ変更可能な連続配列
(クラステンプレート)
省スペースな動的ビットセット
(クラステンプレート特殊化)
両端キュー
(クラステンプレート)