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)
- 基本的な型の例です。
#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
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例