Priority_queueの基本内容
クラス priority_queue<> は、優先度に従って要素が読み取られるキューを実装します。そのインターフェイスは queue に非常に似ています。つまり、push() は要素を配置し、top()/pop() は次の要素にアクセス/削除します。ただし、ここでのいわゆる「次の要素」とは、最初に配置される要素ではなく、「最も優先度が高い」要素のことです。
通常どおり、テンプレート パラメーターを使用して並べ替え基準を指定できます。デフォルトの並べ替え基準は、降順を形成するための operalor< であるため、いわゆる「次の要素」は「最大値を持つ要素」になります。同時に最大値を持つ要素が複数ある場合、どれが選択されるかはわかりません。
Priority_queue と一般キューの両方がヘッダー ファイル <queue>で定義されます。
#include <queue>
ヘッダー ファイル <queue> では、クラス priority_queue が次のように定義されています。
namespace std {
template <typename T,typename Container = vector<T>,
typename Compare = less<typename Container::value_type>>
class priority_queue;
最初のテンプレート パラメータは要素タイプで、デフォルト値を持つ 2 番目のテンプレート パラメータは、優先キュー内に要素を格納するために使用されるコンテナを定義します。デフォルトのコンテナはベクトルです。デフォルト値を持つ 3 番目のテンプレート パラメーターは、「次に優先度の高い要素を見つけるため」の並べ替え基準を定義します。デフォルトでは比較基準として演算子<になります。
実際、priority_queue はさまざまな操作を内部コンテナの対応する呼び出しに変換するだけです。ランダム アクセス イテレータと、front()、push_back()、pop_back() およびその他の操作をサポートしている限り、任意のシーケンス コンテナを使用して priority_queue をサポートできます。プライオリティ キューは STL ヒープ アルゴリズムを使用する必要があるため、その内部コンテナはランダム アクセスをサポートする必要があります。たとえば、両端キューを使用して要素を保持できます。
std::priority_queue<float,std::deque<float>> pbuffer;
独自の並べ替え基準を定義する場合は、関数または関数オブジェクトを渡して 2 つの要素を比較し、それらを並べ替え基準として使用する必要があります。
たとえば、次の式は逆ソート (降順) 優先キューを定義します。
std::priority_queue<float,std::vector<float>,std::greater<float>> pbuffer;
この優先キューでは、「次の要素」は常に最小値を持つ要素です。
コアインターフェイス
Priority_queue のコア インターフェイスは、主にメンバー関数 Push()、top()、pop() で構成されます。
Push(): 要素を優先キューに入れます。
Pop(): 優先キューから要素を削除します。
top(): 優先キュー内の「次の要素」を返します。
優先キューに要素がない場合、top() および Pop() を実行すると未定義の動作が発生することに注意してください。メンバー関数 size() および empty() を呼び出して、コンテナーが空かどうかを確認できます。
スタディクラス priority_queue<>
Priority_queue は STL のヒープ アルゴリズムを使用します。
namespace std{
template <typename T, typename Container = vector<T>,typename Compare = less<typename Container::value_type>>
class priority_queue{
protected:
Compare comp;
Container c;
public:
explicit priority_queue(const Compare& cmp = Compare(),const Container& cont = Container()):comp(cmp),c(cont) {
make_heap(c.begin(),c.end(),comp);}
void push(const value_type& x) {c.push_back(x);push_heap(c.begin(),c.end(),comp);}
void pop(){pop_heap(c.begin(),c.end(),comp);c.pop_back();}
bool empty() const { return c.empty();}
size_type size() const { return c.size();}
const value_type& top() const { return c.front();}
...
};
}