1. 程式人生 > >C++ 學習筆記之——STL 庫 queue

C++ 學習筆記之——STL 庫 queue

1. 佇列

queue 佇列是一種容器介面卡,專門用來滿足先進先出的操作,也就是元素在容器的一端插入並從另一端提取。

  • bool empty() const; 返回佇列是否為空;
  • size_type size() const; 返回佇列中元素的數量;
  • reference& back(); 返回佇列中最後一個元素也即最新的元素的引用;
  • reference& front(); 返回佇列中的下一個元素也即最舊的元素的引用;
  • void push (const value_type& val); 在隊尾插入一個元素;
  • void pop(); 彈出佇列的下一個元素也即最舊的元素,隊頭元素。

2. 優先順序佇列

優先順序佇列是一種容器介面卡,根據一些嚴格的弱排序標準,專門設計使其第一個元素始終是它包含的最值元素。其本質上就是一個大頂堆或者小頂堆,會在需要時自動呼叫函式 make_heap,push_heap 和 pop_heap 自動完成堆化,比如插入新元素或者彈出堆頂元素。

  • bool empty() const; 返回優先順序佇列是否為空;
  • size_type size() const; 返回優先順序佇列中元素的數量;
  • const_reference top() const; 返回優先順序佇列的頂部元素,也即比較優先順序最高的元素;
  • void push (const value_type& val);
    在優先順序佇列中插入一個元素;
  • void pop(); 彈出優先順序佇列的頂部元素。

下面的例子中展示了構建優先順序佇列,將兩個降序的 vector 合併成一個新的降序的 vector。

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

class mycomparison
{
    bool big_heap; // 大頂堆標誌位,也就是所有元素比堆頂元素小
public:
    mycomparison(const bool& param=true)
    {big_heap = param;}
    bool operator() (const vector<int> vec1, const vector<int> vec2) const
    {
        if (big_heap) return (vec1[0] < vec2[0]);
        else return (vec1[0] > vec2[0]);
    }
};

int main ()
{
    vector<int> vec1;
    vec1.push_back(200);
    vec1.push_back(50);
    vec1.push_back(32);

    vector<int> vec2;
    vec2.push_back(100);
    vec2.push_back(96);
    vec2.push_back(20);

    vector<int> vec3;

    // priority_queue<vector<int>, vector< vector<int>>, mycomparison> q(mycomparison(false));
   // priority_queue<vector<int>, vector< vector<int>>, mycomparison> q(false);
    priority_queue<vector<int>, vector< vector<int>>, mycomparison> q;

    q.push(vec1);
    q.push(vec2);

    while (!q.empty())
    {
        vector<int> temp = q.top();
        q.pop();
        vec3.push_back(temp[0]);
        temp.erase(temp.begin());
        if (temp.size() != 0) q.push(temp);
    }

    for (vector<int>::iterator it = vec3.begin(); it != vec3.end(); it++) cout << *it << ' ';

    return 0;
}

參考資料 [http://www.cplusplus.com]

獲取更多精彩,請關注「seniusen」!