C++ priority_queue用法
知識標籤:STL, adapter, C++
code
#include<iostream>
#include<queue>
#include<string.h>
struct node
{
//默認比較方式
friend bool operator<(node n1, node n2)
{
return n1.priority<n2.priority;
}
friend bool operator>(node n1, node n2)
{
return n1.priority>n2.priority;
}
int priority;
char value[20];
};
int main(void)
{
const int len = 5;
int i;
int a[len] = {3, 5, 9, 6, 2};
//示例1
//priority_queue<int>省略了2個參數,第二個參數爲容器類型,第三個爲比較方式
//默認的容器類型爲vector,本例中爲vector<int>
//比較方式默認爲operator<,故默認優先隊列是大頂堆
std::priority_queue<int> qi;
for(i = 0; i < len; ++i)
qi.push(a[i]);
for(i = 0; i < len; ++i)
{
std::cout << qi.top() << " ";
qi.pop();
}
std::cout << std::endl;
//示例2
//STL中定義了一個仿函數greater<>,可以用它聲明小頂堆
//priority_queue根據給定的比較規則(即第三個參數)利用堆對第二個參數vector中的元素進行排序
std::priority_queue<int, std::vector<int>, std::greater<int> > qi2;
for(i = 0; i < len; ++i)
qi2.push(a[i]);
for(i = 0; i < len; ++i)
{
std::cout << qi2.top() << " ";
qi2.pop();
}
std::cout << std::endl;
//示例3
std::priority_queue<node> qi3;
node b[len];
b[0].priority = 6; strcpy(b[0].value, "小明");
b[1].priority = 9; strcpy(b[1].value, "小花");
b[2].priority = 2; strcpy(b[2].value, "小李");
b[3].priority = 8; strcpy(b[3].value, "小紅");
b[4].priority = 1; strcpy(b[4].value, "小王");
for(i = 0; i < len; ++i)
qi3.push(b[i]);
for(i = 0; i < len; ++i)
{
std::cout << qi3.top().priority << "\t" << qi3.top().value << std::endl;
qi3.pop();
}
//示例4
std::cout << "-----------------------------" << std::endl;
std::priority_queue<node, std::vector<node>, std::greater<node> > qi4;
for(i = 0; i < len; ++i)
qi4.push(b[i]);
for(i = 0; i < len; ++i)
{
std::cout << qi4.top().priority << "\t" << qi4.top().value << std::endl;
qi4.pop();
}
return 0;
}