C++ 學習筆記之——STL 庫 queue
阿新 • • 發佈:2018-12-15
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」!