ホームページ  >  記事  >  バックエンド開発  >  C++のプライオリティキューの使い方の詳細な説明

C++のプライオリティキューの使い方の詳細な説明

藏色散人
藏色散人オリジナル
2020-02-10 09:11:434305ブラウズ

C++のプライオリティキューの使い方の詳細な説明

#c プライオリティキューの使い方の詳しい説明

プライオリティキューもキューなどのデータ構造の一種です。その動作はキューの先入れ先出しに限定されず、論理的に実行することもできます(最大値または最小値に従ってキューから出るなど)。

推奨学習:

c ビデオ チュートリアル

通常のキューは先入れ先出しのデータ構造であり、要素はキューの最後に追加されて削除されます。行列の先頭から。

優先キューでは、要素に優先順位が与えられます。要素にアクセスすると、最も優先度の高い要素が最初に削除されます。プライオリティ キューには、先入れ最大出力の動作特性があります。

まず、ヘッダー ファイル #include578d2716abf2876f231498269846f87d をインクルードする必要があります。これとキューの違いは、その中のデータの優先順位をカスタマイズできることです。優先順位の高いものがキューの先頭に配置されます。優先順位をキューから外してください。

プライオリティ キューには、キューの基本操作を含む、キューのすべての特性が備わっています。これに基づいて内部ソートが追加されるだけであり、基本的にはヒープとして実装されます。

基本的な操作はキューの場合と同じです。

top はキューの先頭要素にアクセスします。

empty キューが空かどうかを確認します。

size はキュー内の要素の数を返します

push 要素をキューの最後に挿入します (および並べ替えます)

emplace 要素を適切な場所に構築してキューに挿入します

pop キューの先頭にある要素をポップします

交換コンテンツを交換します

定義:

priority_queueab91b0b20a82ad8d07046f6e05e9fd7f

Type はデータ型、Container はコンテナのタイプです (コンテナは、vector、deque などの配列で実装されたコンテナである必要がありますが、リストは使用できません。STL ではデフォルトで Vector が使用されます) 、Functional は比較方法です。

カスタム データ タイプを使用する必要がある場合は、これら 3 つのパラメータを渡す必要があります。基本データ タイプを使用する場合は、データ タイプのみを渡す必要があります。デフォルトはビッグ ヒープです。

一般:

//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

1. 基本型優先キューの例:

#include<iostream>
#include <queue>
using namespace std;
int main() 
{
    //对于基础类型 默认是大顶堆
    priority_queue<int> a; 
    //等同于 priority_queue<int, vector<int>, less<int> > a;
    
    //      这里一定要有空格,不然成了右移运算符↓↓
    priority_queue<int, vector<int>, greater<int> > c;  //这样就是小顶堆
    priority_queue<string> b;

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

    while (!c.empty()) 
    {
        cout << c.top() << &#39; &#39;;
        c.pop();
    }
    cout << endl;

    b.push("abc");
    b.push("abcd");
    b.push("cbd");
    while (!b.empty()) 
    {
        cout << b.top() << &#39; &#39;;
        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 << &#39; &#39; << a.top().second << &#39;\n&#39;;
        a.pop();
    }
}

実行結果:

2 5
1 3
1 2
请按任意键继续. . .

3. 優先キュー要素としてカスタム タイプを使用する例

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

//方法1
struct tmp1 //运算符重载<
{
    int x;
    tmp1(int a) {x = a;}
    bool operator<(const tmp1& a) const
    {
        return x < a.x; //大顶堆
    }
};

//方法2
struct tmp2 //重写仿函数
{
    bool operator() (tmp1 a, tmp1 b) 
    {
        return a.x < b.x; //大顶堆
    }
};

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 << &#39;\n&#39;;
        d.pop();
    }
    cout << endl;

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

実行結果:

3
2
1
 
3
2
1
请按任意键继续. . .

以上がC++のプライオリティキューの使い方の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。