最近在练习编程,看到很多题目的求解中都要用到堆。自己只是看了c++primer,没有看STL。因此对这部分不是很清楚,感觉c++STL里面好多东西。通过这篇文章总结一下优先级队列的使用。
具体堆的操作可以参考:http://blog.csdn.net/xiajun07061225/article/details/8553808
首先要比较一下STL中队列和优先级队列支持的操作:
q.empty( ) 队列和优先级队列对象都有的操作用来判断,队列是否为空。
q.size( ) 队列和优先级队列对象都有的操作用来返回队列中元素的个数。
q.push( ) 队列和优先级队列对象都有的操作用来向队列队尾中插入元素, 对于有衔接队列priority_queue的对象,在基于优先级的适当位置插入新元素(如果,实现优先级队列的是vector的话,我的理解是先插入元素,在来调整优先级队列)。
q.pop( ) 队列和优先级队列对象都有的操作用来删除队列队首元素。
**只适用于队列queue对象的操作**:q.front( )用来返回队首元素,但不删除该元素;q.back( )用来返回队尾元素,但不删除该元素
**只适用于优先级队列priority_queue对象的操作**:q.top( )用来返回队首元素,但不删除该元素
下面是一些联系例子:
/**********************************************
下面的代码段测试优先级队列来构造大根堆
**********************************************/
#include <iostream>
#include <queue>
using namespace std;
int main(void)
{
priority_queue<int> prq;
int a[] = {27, 23, 28, 0, 7, 8, 100};
int len = sizeof(a) / sizeof(int);
cout << "len = " << len << endl;
for (int i = 0; i < len; i++)//将数组a中的元素压入大根堆中
{
prq.push(a[i]);
}
while (!prq.empty())//依次输出大根堆中的元素
{
cout << prq.top() << endl;
prq.pop();
cout << endl;
}
return 0;
}
以下的练习参考http://blog.chinaunix.net/uid-533684-id-2100009.html
//上面的构建是一个大根堆,那么我要想建一个小根堆该怎么办
priority_queue调用STL里面相关算法如make_heap(),pop_heap(),push_heap()算法来实现堆。我们可以写一个自己的对
/**********************************************
下面的代码段测试优先级队列来构造大根堆
**********************************************/
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
template <class Type>
class my_priority_queue
{
public:
void push(Type value){
data.push_back(value);
push_heap(data.begin(), data.end());
}
bool empty(){
return data.empty();
}
size_t size(){
return data.size();
}
Type top(){
if (!empty()){
return data[0];
}
else {
throw new exception("empty");
}
}
void pop(){
if (!empty()){
pop_heap(data.begin(), data.end());
data.pop_back();//pop_back()删除容器的最后一个元素
}
}
private:
vector<Type> data;
};
int main(void)
{
my_priority_queue<int> prq;
int a[] = {27, 23, 28, 0, 7, 8, 100};
int len = sizeof(a) / sizeof(int);
cout << "len = " << len << endl;
for (int i = 0; i < len; i++)//将数组a中的元素压入大根堆中
{
prq.push(a[i]);
}
while (!prq.empty())//依次输出大根堆中的元素
{
cout << prq.top() << endl;
prq.pop();
cout << endl;
}
return 0;
}