「STL」キューとpriority_queue(C ++の詳細な要約)

特徴

  1. キュー:ファーストインファーストアウト
  2. priority_queue:ファーストイン、ファーストアウトですが、並べ替えの優先度を定義できます。

メンバー機能

キュー:

back()は最後の要素を返します

empty()は、キューが空の場合にtrueを返します

front()は最初の要素を返します

pop()最初の要素を削除します

push()は最後に要素を追加します

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

優先キュー:

back()は最後の要素を返します

empty()は、キューが空の場合にtrueを返します

top()は最初の要素を返します

pop()最初の要素を削除します

push()は最後に要素を追加します

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

注意

優先キューを定義する方法は2つあります。

 priority_queue<Example> pq1;
 priority_queue<int,vector<int>,less<int>>q2;//神奇的降序
 priority_queue<Example2,vector<Example2>, cmp> pq2;

次のpriority_queue <int、vector、greater> q形式の説明を次に示します。
ご覧のとおり、デフォルトのテンプレートには3つのパラメーターがあり、最初のパラメーターは優先キュー処理クラスです。2番目のパラメーターはより特徴的で、優先キューを保持するコンテナーです。実際、優先キューは、コンテナC ++言語のヒープに対する関連操作によって実装されます。このコンテナはデフォルトでベクターですが、デキューすることもできます。後者の方が強力で、ベクターよりもパフォーマンスが低いためです。後者の機能は優先キューにパッケージ化した後はあまり良くないことを考慮して、通常はこれを行うように選択されます。コンテナ。3番目のパラメーターはより重要であり、比較構造をサポートします。デフォルトは少なくなります。デフォルトでは、最初のパラメーターによって決定されたクラスの<演算子が比較関数として選択されます。

次に、チートを始めました。使用する構造は少なくなりますが、キューの順序は最初に大きくなります。つまり、降順です。言い換えれば、ここのパラメータは実際には非常に傲慢です。つまり、!Cmpの場合、この実現の目的が何であれ、誰もがこの実現のみを受け入れることができます。

一般に、1次元データの場合、greater <class>(昇順)またはless <class>(降順)を直接使用して、優先度キューの優先度定義を実装できます。多次元の場合、クラスの自己ソートと、動作する比較関数cmpを定義する方法があります。優先キューが多次元的に定義された比較機能を引き続き処理することは一貫しています。cmpは、昇順を定義することを意味し、降順で並べ替えられます。

コード表示

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<stack>
#include<map>
#include<math.h>
#include<set>
#include<list>
#include<string>
#include<random>
#define maxn 50

using namespace std;

struct Example{
    
    
    int x,y;
    bool operator <(const Example & a) const
    {
    
    
        if(x==a.x)
            return a.y<y;//升序排序
        return x<a.x;//降序排序
    }
};

struct Example2{
    
    
    int x,y;
};


struct cmp{
    
    
    bool operator () (const Example2 &a,const Example2 &b)const
    {
    
    
         if(b.x==a.x)
            return a.y<b.y;//降序排序
        return b.x<a.x;//升序排序
    }
};



void init( queue<int>& q)
{
    
    
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
    cout<<"初始化给queue值:";
    for(int i=0; i<10; ++i)
        {
    
    
            int value=u(e);
            cout<<value<<" ";
            q.push(value);
        }
    cout<<endl;
}

void output(queue<int> q)
{
    
    
    cout<<"输出queue:"<<endl;
    while(!q.empty())
    {
    
    
        cout<<q.front()<<" ";
        q.pop();
    }
    cout<<endl;
}

void init1(priority_queue<int,vector<int>,greater<int> >&q)
{
    
    
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
    cout<<"初始化给priority_queue值:";
    for(int i=0; i<10; ++i)
        {
    
    
            int value=u(e);
            cout<<value<<" ";
            q.push(value);
        }
    cout<<endl;
}

void output1( priority_queue<int,vector<int>,greater<int> >q)
{
    
    
    cout<<"输出priority_queue(great<int>):"<<endl;
    while(!q.empty())
    {
    
    
        cout<<q.top()<<" ";
        q.pop();
    }
    cout<<endl;
}

void init2( priority_queue<Example>& q)
{
    
    
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
    cout<<"初始化给优先队列值:";
    for(int i=0; i<10; ++i)
        {
    
    
            int valueX=u(e);
            int valueY=u(e);
            cout<<valueX<<","<<valueY<<" ";
            q.push({
    
    valueX,valueY});
        }
    cout<<endl;
}

void output2(priority_queue<Example> q)
{
    
    
    cout<<"输出priority_queue (类自带排序):"<<endl;
    while(!q.empty())
    {
    
    
        cout<<q.top().x<<","<<q.top().y<<" ";
        q.pop();
    }
    cout<<endl;
}

void init3( priority_queue<Example2,vector<Example2>, cmp> & q)
{
    
    
    default_random_engine e;
    uniform_int_distribution<unsigned> u(0, 9);//产生随机数,0到9的闭区间。
    cout<<"初始化给priority_queue值:";
    for(int i=0; i<10; ++i)
        {
    
    
            int valueX=u(e);
            int valueY=u(e);
            cout<<valueX<<","<<valueY<<" ";
            q.push({
    
    valueX,valueY});
        }
    cout<<endl;
}

void output3(priority_queue<Example2,vector<Example2>, cmp> q)
{
    
    
    cout<<"输出优先队列(自定义cmp):"<<endl;
    while(!q.empty())
    {
    
    
        cout<<q.top().x<<","<<q.top().y<<" ";
        q.pop();
    }
    cout<<endl;
}


int main()
{
    
    
    queue<int> q1;
    init(q1);
    output(q1);
    cout<<"最后一个元素:"<<q1.back()<<endl;
    cout<<"queue的大小:"<<q1.size()<<endl;

    priority_queue<int,vector<int>,greater<int>>q2;//神奇的升序。 less<int> 神奇的降序
    init1(q2);
    output1(q2);


    priority_queue<Example> pq1;
    init2(pq1);
    output2(pq1);

    priority_queue<Example2,vector<Example2>, cmp> pq2;
    init3(pq2);
    output3(pq2);

    return 0;
}

結果表示:

結果

もう1つのポイント:

ランダム番号参照:c ++ 11の簡単な使用法ランダムライブラリ
参照:優先キュー

おすすめ

転載: blog.csdn.net/Look_star/article/details/107247945