首先看下优先队列的STL源码:
class priority_queue
{
protected:
_Sequence c; ///容器
_Compare comp; ///比较准则
public:
bool empty() const
{ return c.empty(); }
size_type size() const
{ return c.size(); }
const_reference top() const
{
__glibcxx_requires_nonempty();
return c.front();
}
void push(const value_type& __x)
{
try
{
c.push_back(__x);
std::push_heap(c.begin(), c.end(), comp);
}
catch(...)
{
c.clear();
__throw_exception_again;
}
}
void pop()
{
__glibcxx_requires_nonempty();
try
{
std::pop_heap(c.begin(), c.end(), comp);
c.pop_back();
}
catch(...)
{
c.clear();
__throw_exception_again;
}
}
}
用法:
C++头文件 #include <queue>
template<typename _Tp,
typename _Sequence = vector<_Tp>,
typename _Compare = less<typename _Sequence::value_type> >
第一个参数 _Tp: 指定存储的类型名称;
第二个参数 _Sequence: 指定存储的数据结构,该结果必须支持随机存取迭代器;
第三个参数 _Compare : 比较函数,对于自定义类型有两种方法实现大小顶堆,第一个是重载操作符,第二个是写一个结构实现比较。
各个数据类型算法讲解如下:
1. 对于一般的基本数据类型,比如 int,double等。
1). 默认是大顶堆,测试代码如下
int main()
{
priority_queue<int,vector<int>, less<int> > max;
for(int i=0;i<10;i++){
max.push(rand()%20);
}
while(!max.empty()){
cout<<max.top()<<" ";
max.pop();
}
return 0;
}