1. 程式人生 > >C++ 優先佇列的使用

C++ 優先佇列的使用

首先看下優先佇列的STL原始碼:

class priority_queue
{
     protected:
         _Sequence  c;                  ///容器
        _Compare   comp;          ///比較準則
     public:
     bool empty() const
     { return c.empty(); }
     size_type size() const
     { return c.size(); }
     const_reference top() const
     {
         __glibcxx_requires_nonempty();
         return c.front();
     }
     void push(const value_type& __x)
     {
         try
         {
          c.push_back(__x);
          std::push_heap(c.begin(), c.end(), comp);
        }
        catch(...)
        {
           c.clear();
           __throw_exception_again;
         }
     }
     void pop()
     {
         __glibcxx_requires_nonempty();
         try
         {
           std::pop_heap(c.begin(), c.end(), comp);
           c.pop_back();
         }
         catch(...)
         {
           c.clear();
           __throw_exception_again;
         }
     }

}

用法:

C++標頭檔案 #include <queue>

template<typename _Tp,
             typename _Sequence = vector<_Tp>,
             typename _Compare  = less<typename _Sequence::value_type> >

第一個引數 _Tp: 指定儲存的型別名稱;

第二個引數 _Sequence: 指定儲存的資料結構,該結果必須支援隨機存取迭代器;

第三個引數 _Compare : 比較函式,對於自定義型別有兩種方法實現大小頂堆,第一個是過載操作符,第二個是寫一個結構實現比較。

各個資料型別演算法講解如下:

1.  對於一般的基本資料型別,比如 int,double等。

1).    預設是大頂堆,測試程式碼如下

int main()
{
    priority_queue<int,vector<int>, less<int> > max;
    for(int i=0;i<10;i++){
        max.push(rand()%20);
    }
    while(!max.empty()){
        cout<<max.top()<<" ";
        max.pop();
    }
    return 0;
}