優先隊列是一種比較常用的結構,雖然被稱為隊列,但卻不是隊列。這里的隊列我猜測是源自於操作系統中的概念。操作系統負責管理計算機的資源並且負責調配,而對cpu計算時間資源的調配是一個比較核心的問題,線程是cpu資源調度的最小單元,通常每一個線程都會綁定一個優先級的,在操作系統復雜的調度機制中,有這么一小塊場景中決定哪一個線程使用cpu資源是有優先級決定的,這樣操作系統就需要維護一個優先級相關的隊列,這里把它命令為隊列,我猜想是因為這些線線都在排隊等待cpu資源,所以在這個場景里把它叫做隊列,而實際上實現起來,它的邏輯結構是一棵樹,可以用二叉堆來實現。
priority_queue is a simple data structure.因為它支持的操作極少,它的核心操作是支持在常量時間內獲得最優先的元素。priority_queue支持push, pop, top這三個核心的操作。其實對於C++程序員來說,priority_queue還是比較容易理解的,唯一的難點就在於如何構造優先隊列,更具體的說,這里的難點是如何使用自己定義的結構作為優先隊列中的元素。如果是C++的基本數據類型,那是十足的簡單,如果自己定義一個數據結構不管是使用類還是使用結構體,如何把自定義的結構套入到當前的優先隊列模板中,在使用上這是priority_queue唯一能稱的上有點難度的難點。下面分享一下我的收獲,雖然還沒有對STL中優先隊列的底層實現有多少了解,但是想要研究一個事物,第一次是認識這個事物,首先要學會至少一種解決問題的方法,然后再滾雪球,這就是積累,這是克服望而生畏,積極動手實踐的好方法。不管怎樣,先解決問題,再步步優化。喲~,沒完沒了了。下面貼一下代碼,你自己也可以動手寫一下:
#include <iostream> #include <queue> using namespace std; struct node{ int idx; int key; node(int a=0, int b=0):idx(a), key(b){} }; struct cmp{ bool operator()(node a, node b){ return a.key > b.key; } }; int main(){ priority_queue<node, vector<node>, cmp> q; int i; for(i=0;i<10;++i){ q.push(node(i, i)); } while(!q.empty()){ cout<<q.top().key<<endl; q.pop(); } return 0; }
以上我自己定義了一個結構,並且定義了一個cmp的結構用於實現自定義的比較方法。比較函數有兩個參數a和b,很長時間都沒有理解這里的比較函數的工作原理,到底這里返回
a>b和a<b的結果到底是什么?最后,我想到了一個場景來記憶這里的比較函數的意義:a,b是該數據結構中前后兩個元素,如果返回true,這兩個元素就需要交換位置,反之則不需要。這樣一想,和它實際的作用是對應的,我猜想我這么想正確一定是有原因的,或許底層實現的時候,設計者就是這么定義的,嘿嘿,到時候研究的時候就知道了,現在可以這么想,如果你也記不住的話。