1. ホーム
  2. c++

c++のpriority_queueの使い方の説明

2022-03-15 12:58:42
<パス

キューなので、ヘッダーファイルは最初にインクルードする必要があります。 #include <queue> と同じです。 queue 違いは、その中のデータの優先順位をカスタマイズできることで、優先順位の高いものがキューの先頭に来て、最初に出てくるようになります

プライオリティ・キューは、基本的な操作を含むキューのすべての機能を備えていますが、その上に内部ソートを追加しており、本質的にはヒープを実装したものとなっています

<ブロッククオート

キューと同じ基本操作

  • top head要素にアクセスします。
  • empty キューが空かどうか
  • size はキュー内の要素数を返します。
  • push 待ち行列の末尾に要素を挿入する(ソートする)。
  • emplace 要素を定位置で作成し、キューに挿入します。
  • pop キューの先頭の要素をpopします
  • swap swap コンテンツ

定義

priority_queue<Type, Container, Functional>



タイプ は、そのデータ型 コンテナ はコンテナ型です(Containerはvectorやdequeなどの配列実装でなければならず、リストではありません;STLのデフォルトはvectorです). 機能的 は比較方法です。カスタムデータ型を使用する必要がある場合は、これらの3つのパラメータを渡すだけでよく、基本データ型を使用する場合は、データ型を渡すだけでよい、デフォルトはビッグトップヒープ

一般的なのは

// ascending queue
priority_queue <int,vector<int>,greater<int> > q;
// descending queue
priority_queue <int,vector<int>,less<int> > q;

//greater and less are two faux functions implemented by std (that is, they make the use of a class look like a function. The implementation is to implement an operator() in the class, and the class will have function-like behavior, which is a function-like class)



  1. 基本的な型の例です。
#include<iostream>
#include <queue>
using namespace std;
int main() 
{
    // for base type default is big top heap
    priority_queue<int> a; 
    //equivalent to priority_queue<int, vector<int>, less<int> > a;
    
  
    priority_queue<int, vector<int>, greater<int> > c; //this is the small top heap
    priority_queue<string> b;

    for (int i = 0; i < 5; i++) 
    {
        a.push(i);
        c.push(i);
    }
    while (!a.empty()) 
    {
        cout << a.top() << ';
        a.pop();
    } 
    cout << endl;

    while (!c.empty()) 
    {
        cout << c.top() << ';
        c.pop();
    }
    cout << endl;

    b.push("abc");
    b.push("abcd");
    b.push("cbd");
    while (!b.empty()) 
    {
        cout << b.top() << ';
        b.pop();
    } 
    cout << endl;
    return 0;
}


出力

4 3 2 1 0
0 1 2 3 4
cbd abcd abc


2.パリの比較、最初の要素を最初に比較し、最初の要素と2番目の要素を等しくする

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() 
{
    priority_queue<pair<int, int> > a;
    pair<int, int> b(1, 2);
    pair<int, int> c(1, 3);
    pair<int, int> d(2, 5);
    a.push(d);
    a.push(c);
    a.push(b);
    while (!a.empty()) 
    {
        cout << a.top().first << ' ' << a.top().second << '\n';
        a.pop();
    }
}


出力

2 5
1 3
1 2


3. カスタムタイプの場合

#include <iostream>
#include <queue>
using namespace std;

// method 1
struct tmp1 //operator overloading<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; // big top heap
    }
};

// method 2
struct tmp2 // rewrite the imitation function
{
    bool operator() (tmp1 a, tmp1 b) 
    {
        return a.x < b.x; //big top heap
    }
};

int main() 
{
    tmp1 a(1);
    tmp1 b(2);
    tmp1 c(3);
    priority_queue<tmp1> d;
    d.push(b);
    d.push(c);
    d.push(a);
    while (!d.empty()) 
    {
        cout << d.top().x << '\n';
        d.pop();
    }
    cout << endl;

    priority_queue<tmp1, vector<tmp1>, tmp2> f;
    f.push(c);
    f.push(b);
    f.push(a);
    while (!f.empty()) 
    {
        cout << f.top().x << '\n';
        f.pop();
    }
}


出力

3
2
1

3
2
1