C ++ STLのプライオリティキュー

まず、について話すファンクタ

ファンクタ

ファンクタ(ファンクタ)は、クラスのような機能のルックスを利用することです。その実装がクラスで達成される演算子()は、このクラスの挙動は同様の機能を有し、クラスがファンクタです。主な機能は、ファンクタのSTLアルゴリズムを一致させることである単独でファンクタが比較的小さいために使用されます。(感謝Baiduの百科事典)

たぶん、あなたはまだ終わりでそれを読んだ後、理解していない役割は、その後、私は単に話をし持っているか、やっています

括弧をオーバーロードクラス構造や機能の1つまたは複数のメンバーとのファンクタである、また、ファンクタクラスと呼ばれます

Functorクラスは、使用する機能の両方にすることができ、構造を使用する場合、メリットはそう、あなたがSTLテンプレートクラスを通過する書き込みを伝達関数とすることができるということです

以下の

#include <bits/stdc++.h>
using namespace std;
struct disp{
	void operator()(int x){
		cout<<x<<endl;
	}
};
int main(){
	disp()(2);
	return 0;
}

道具出力機能-int型のX

転送テンプレートクラスのために我々は質問に今日言わなければならない - 優先キュー--priority_queue

プライオリティキュー、キューは本質的ではなく、スタック、およびデフォルト大きなルート(最上位)スタック

宣言の定義:PRIORITY_QUEUE <T、コンテナ、比較>

Tはデータ型であります

容器は、基礎となる容器、内部プライオリティキューの実装として使用される容器の底部であります

比較データ配置、より多くのファンクタクラスに合格する必要があることです

ノートへのポイントは以下のとおりであります:

①タイプTが少ないより比較機能を有しており、コンテナの比較を省略してもよいし、デフォルトは以下のベクトルである場合

②Containerがランダムではなく、ジョブの容器イテレータ減算機能が存在しなければなりません

    (内部コードプライオリティキューを読んだ後、プロセスは、減算器反復の機能を実現することが見出されました)

    そのような容器は、一般的に添字によって、一般的に連続したメモリアドレス(イテレータ連続)しています

    ブロガーは両端キュー、ベクトル、配列を知っていました

    メモリアレイサイズのニーズを設定するもので、無制限ではないが、それは一般的ではありません

    PRIORITY_QUEUEためのデックとベクトルの間の差のために

    ブロガーは責任を伝えることができます:違いはありません!両者の差の内部実装の一部はPRIORITY_QUEUEを含みません

    PRIORITY_QUEUEとユーザーインターフェースを提供しますが、また、非常に狭いですが、それは両端キューおよびベクトル関数を含みません

③T型構造またはクラスの場合、カスタムノード、例えば

    だから、次のことが必要不可欠であると言います

    あなたは、どちらかの小なり記号内のノードを、オーバーロード、またはファンクタクラスを作成します

    あまり<ノード>はそのようなものになるかもしれません

優先キューの宣言と定義:

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
struct node{
	int x;
	bool operator<(node a)const{
		return x<a.x;
	}
};
struct node2{
	int x;
	friend bool operator<(node2 a,node2 b){
		return a.x<b.x;
	}
};
struct cmp{
	bool operator()(int a,int b){
		return a<b;
	}
};
int main(){
	priority_queue<int> q0;
	priority_queue<int,vector<int>,less<int>> q1;
	priority_queue<int,deque<int>,less<int>> q2;
	priority_queue<int,array<int,100>,less<int>> q3;
	priority_queue<int,vector<int>,cmp> q4;
	priority_queue<node> q5;
	priority_queue<node2> q6;
	return 0;
}

上記の文言のすべてがすべてです、大きなルートヒープ(トップ大)、小根の共感

そして、注意を払います!メンバ関数内のノードは、constの書かなければなりません!

内部実装は、多くの場合、メンバ関数であると、多くの場合、メンバ関数とメンバ関数は、非常に異なる機能です!

フレンド機能は、その後、あなたはもうこれを心配する必要はありません、または非常に多くの場合のみメンバ関数

あなたはconstのノードを書く&ならば、それははるかに高速になります次に、タイムカードに直面した問題は、非常に効果的になりますが、関わる書き込みはコンパイラのバグを書きませんかないだろう

多くの場合、constメンバ関数が不足しているしてはいけません!あなたが欠落することはできません!

次に誰かが、なぜそれほど根、大きいの内部コードを見て、以下を要求します

/// One of the @link comparison_functors comparison functors@endlink.
  template<typename _Tp>
    struct less : public binary_function<_Tp, _Tp, bool>
    {
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x < __y; }
    };

/// One of the @link comparison_functors comparison functors@endlink.
  template<typename _Tp>
    struct greater : public binary_function<_Tp, _Tp, bool>
    {
      bool
      operator()(const _Tp& __x, const _Tp& __y) const
      { return __x > __y; }
    };

私が言うべきか、あなたの例を与えます

例えば[5] = {3,1,5,4,2}。

ソート(、+ 5、少ない<整数>());

結果:1,2,3,4,5

キュー、キューイェジン、両端キューハオのために

標準大きいが帰ってきたの下添字は、小さなフロント(イテレータが始まる)である(反復子終了)

PRIORITY_QUEUE、代わりにフロントのトップが、戻って、そのキューにこの事と何のために、幽霊はどのように名前を知っているから

バックエンドの操作で、スタックと同様に

大きなヒープの根であるので、小型から大型まで少なくすることによりPRIORITY_QUEUEは、その後、バックエンドは、大きいです

我々はそれを実現する方法について、これの十分な理解が何である必要があり、このPRIORITY_QUEUEについてはあまり話します

最後に、それは最も簡単な部分を言います

一部の操作(メンバ関数):

priority_queue<int> q;
q.push(x);//压入堆顶
q.emplace(x);//压入堆顶
q.empty();//是否空
q.size();//个数
q.swap(q2);//交换
q.top();//堆顶元素的引用

まあ、おそらくこれらは、私は非常に詳述されていることを感じ、そしてすべての人に大きな助けを学ぶことができるはずです

发布了49 篇原创文章 · 获赞 0 · 访问量 1721

おすすめ

転載: blog.csdn.net/weixin_44077863/article/details/102020177