STL學習筆記 priority queue

2022-02-08 06:01:23 字數 2784 閱讀 3607

priority_queue 優先佇列容器

優先佇列容器也是一種從一端入隊,另一端出對的佇列。不同於一般佇列的是,佇列中最大的元素總是位於隊首位置,因此,元素的出對並非按照先進先出的要求,將最先入隊的元素出對,而是將當前佇列中的最大元素出對。

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 函式的使用原型。

bool empty()

1 -----------------------------------------按優先順序分別獲取優先佇列的所有元素

2 #include 3 #include 4

using

namespace

std;

5int

main()

620 cout <2122

return0;

23 }

1

/*佇列的大小

2優先佇列的元素個數可用 size 函式獲取。如果每次元素入隊前,都先檢查當前佇列的元素個數,以此判斷是否再允許元素入隊,那麼就可實現乙個具有固定大小的優先佇列。如下是 size 函式的使用原型

3size_type size()45

下面的示例程式將優先佇列設為 50 個 int 元素大小,並使用具有陣列操作符 "" 的雙端佇列 deque 作底層結構,每當元素入隊時,都呼叫 size 函式檢查是否會超過限定的長隊界限,實現出乙個固定大小的優先佇列。6*/

78 ------------------------------------------固定大小的優先佇列

9 #include 10 #include 11

#define queue_size 50

12using

namespace

std;

13int

main()

1431 cout <3233

return0;

34 }

--------------------- priority_queue 小結

priority_queue 優先佇列是一種應用相當廣泛的資料結構,元素入隊後按優先順序進行出對,作業系統和一些應用程式的任務排程處理都使用了優先佇列來實現。c++ stl 提供的 priority_queue 容器對優先佇列的資料結構和受限操作進行了泛化封裝,包括佇列初始化、元素入隊、取隊首元素(優先順序最高的元素)、元素出對、佇列是否為空以及獲取當前佇列長度等操作。

不同於 queue 佇列,priority_queue 優先佇列預設使用 vector 作底層架構,獲取隊首元素的函式為 top 函式,不提供獲取隊尾的函式。同樣地,通過檢查當前優先佇列長度,可決定是否允許元素入隊,以此實現具有固定長度的優先佇列。

STL學習筆記

1.stl六大元件 1 容器 各種資料結構,如vector,list,deque,set,map,用來存放資料,從實現的角度看,stl容器是一種class template。2 演算法 各種常用的演算法如sort,search,copy,erase.從實現的角度看,stl演算法是一種function...

STL學習筆記

容器是用來存放資料的,掌握容器特性才能更好地選擇合適的容器載資料。這裡要記住,可自主選擇插入的位置 vectors 可隨機訪問,可變長陣列,可快速在尾部插入刪除,不適合在中部頭部頻繁插入刪除 deques 可隨機訪問,佇列,先進先出,可快速在頭部尾部插入刪除,同樣不適合在中部插入刪除元素 list ...

STL 學習筆記 default alloc

下面是沒有加上多執行緒安全的default alloc template模板類以及實現 o 本人比較懶,自己寫的注釋都寫在書上了,覺得自己敲出來理解的更加透徹些。template class default alloc template enum enum union obj static obj ...