優先佇列容器也是一種從一端入隊,另一端出對的佇列。不同於一般佇列的是,佇列中最大的元素總是位於隊首位置,因此,元素的出對並非按照先進先出的要求,將最先入隊的元素出對,而是將當前佇列中的最大元素出對。
c++ stl 優先佇列的泛化,底層預設採用 vector 向量容器,使得佇列容器的元素可做陣列操作,從而應用堆演算法找出當前佇列最大元素,並將它調整到隊首位置,確保最大元素出隊。
堆演算法(heap algorithm) 具有 nlog(n) 階的演算法時間複雜度,優先佇列也可看作容器介面卡,將底層的序列容器 vector 轉換為優先佇列 priority_queue.
priority_queue 優先佇列容器的 c++ 標準標頭檔案也是 queue ,需要用巨集語句 "#include " 包含進來。
同樣是因為僅需取隊首和隊尾元素的操作,因此 priority_queue 優先佇列容器也不提供迭代器,對其他任意位置處的元素進行直接訪問操作。使用時,一般用 priority_queue的形式進行具現, t 是優先佇列元素的乙個具現型別。
建立 priority_queue 物件
使用 priority_queue 佇列之前,要先利用建構函式生成乙個優先物件,才可進行元素的入隊、出對、取隊首及隊尾等操作。
1. priority_queue()
預設的建構函式,建立乙個空的 priority_queue 物件。例如,下面一行**使用預設的 vector 為底層容器,建立了乙個空的優先佇列物件 pq ,資料元素為 int 型別。
priority_queuepq;
2. priority_queue(const priority_queue&)
複製建構函式,用乙個優先佇列物件建立新的優先佇列物件。例如,下面一行**利用 priority_queue 物件 pq1 ,建立乙個以雙向鍊錶為底層容器的 priority_queue 物件 pq2 。
// priority_queue> pq1;
priority_queue> pq2(pq1);
元素入隊
優先佇列容器的元素入隊函式也是 push 函式,它呼叫堆演算法函式將入隊的元素移至佇列堆中的正確位置,保證佇列優先順序高的元素始終位於隊首。優先佇列也不預設固定的大小,因此 push 函式不判斷佇列空間是否已滿,都將元素放入佇列。push 函式不會返回元素入隊是否成功的資訊。
void push(const value_type& x)
元素出對
優先佇列容器的元素出對函式為 pop 函式,將優先順序最高的元素刪掉。該函式不判斷佇列是否已為空,都試圖將隊首元素刪除。一般要先判斷佇列不為空,才進行元素出對操作。
取隊首元素
優先佇列容器的 top 函式,可用來讀取隊首元素,即優先順序最高的元素。這個函式實際是呼叫了底層容器的 front 函式。需要注意的是,優先佇列容器並不提供獲取隊尾元素的函式。如下是 top 函式的使用原型。
const value_type& top() const
佇列非空判斷
優先佇列的操作基本都要使用 empty 函式,判斷入隊和出對的優先佇列是否為空,再作下一步的操作。如下是 empty 函式的使用原型。
#include #includeusing
namespace
std;
intmain()
cout
<
return0;
}
stl原始碼分析之priority queue
前面兩篇介紹了gcc4.8的vector和list的原始碼實現,這是stl最常用了兩種序列式容器。除了容器之外,stl還提供了一種借助容器實現特殊操作的元件,謂之介面卡,比如stack,queue,priority queue等,本文就介紹gcc4.8的priority queue的原始碼實現。顧名...
STL容器 優先佇列priority queue
priority queue顧名思義,是乙個具有權值概念的queue,它和queue一樣允許加入新元素 移除舊元素等功能。由於這是乙個queue,所以只允許在底部加入元素,從頂部取出元素。但優先佇列帶有權值概念,其內的元素自動按照元素的權值排序。權值最高者排在最前面。stl的priority que...
STL初步 優先佇列Priority queue
這個優先到底是如何優先?和普通佇列區別在哪?priority queue type,container,functional priority queue,less q priority queue,less a q priority queue,less b 優先佇列中沒有迭代器 也沒有clear...