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」!