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;
}