优先队列

优先队列
根据老师在课上所讲的优先队列还有在csdn上做的几道优先队列的题,我在网上查了很多优先队列的资料,大体上了解了优先队列的内容,下面结合上课所讲还有网上的资料来总结一下优先队列我自己的简介。
优先队列书上说是一种容器适配器,它的第一个元素(位于头部top)总是队列中最大的元素,这里的“最大”是指队列元素的严格弱序中的“最大”。严格弱序是一系列数或事物按照一定的比较关系“<”排列得出的序列,“<”可以是数学中进行数值比较的大于,也可以是小于。
注:在内存充足的情况下,优先队列能被无限地插入元素。
优先队列使用其它容器作为底层容器,并提供一系列访问元素的函数。优先队列中的元素从底层容器的“尾部(back)”出,即是从队列的顶部(top)出。底层容器需要满足的条件是可以通过迭代器随机访问其中的元素并且支持以下的操作:
front()
push_back()
pop_back()
所以,容器vector和deque可以作为底层容器,在创建优先队列时若没有声明使用何种容器,则默认使用vector。
优先队列的格式:
priority_queue

可以看出,创建一个优先队列默认需要三个参数(实际应用上有些参数可以省去)。

T:队列中元素的数据类型
Container: 用于储存和访问队列元素的底层容器的类型。
Compare: 比较关系,默认是数值上的小于关系,比如1<2,6<7,此时队列中元素由队头到队由大到小排列,采用默认compare时此参数可以省去。当需要采用其它标准进行比较时需要额外定义这一比较方式(下例示)。当满足比较关系”<”时,返回true,否则返回false。
下面呈上 一个例子:
#include
#include
using namespace std;

class cmp
{
public:
bool operator() (const int a,const int b)
{
return a>b;
}
};

int main()
{
priority_queueque1;
priority_queueque2;
int a[]={1,3,4,2,5,0,6};
for(int i=0;i<7;i++)
{
que1.push(a[i]);
que2.push(a[i]);
}
cout<<“que1:”;
while(!que1.empty())
{
cout< que1.pop();
}
cout< while(!que2.empty())
{
cout< que2.pop();
}
return 0;
}

输出结果:
que1:0 1 2 3 4 5 6
que2:6 5 4 3 2 1 0
  上例中que1使用比较方式cmp类,队列中元素由小到大排列,而que2使用默认形式的“<”,元素按照优先级排列,队头元素最大。
优先队列比较有用成员函数简介:
(1)priority_queue::empty
判断队列是否为空(也即是size是否为0),是则返回true,否则返回false。
(2)priority_queue::size
返回队列中元素的个数。这个函数也可以用于判断队列是否为空。
(3)priority_queue::top
返回队头元素的常引用,队头元素是在所设定的比较关系下最大也即优先级最高的元素。此函数实际上调用底层容器的front函数。
(4)priority_queue::pop
清除队头元素。
(5)priority_queue::push
给队列插入元素,新元素会按其优先级被排列到适当位置。
注:对于自定义类型比如结构体,必须重载<才能进行比较。

你可能感兴趣的:(c++)