首先要知道,队列和优先队列都是容器适配器,即在已有的容器之上封装而成。
关于容器适配器:C++ STL中的容器适配器详解
队列queue是一种先进先出的数据结构,并且添加元素只能添加在尾部,删除元素只能删除首元素。
q.push(x); //入队:将x压入队列的末端
q.pop(); //出队:弹出队列的队首元素,不返回任何值
q.front(); //返回队首元素
q.back(); //返回队尾元素
q.empty(); //判断队列是否为空
q.size(); //返回队列的元素个数
在STL中队列queue的默认容器是双端队列 deque,也可以使用 list 自定义队列,但是vector不行,因为vector不能提供删除第一个元素这个操作。
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先出队的行为特征。
优先队列实现了类似堆的功能(其实底层就是用堆实现的)。
q.push(x); //入队
q.pop(); //出队
q.top(); //返回队内优先级最高的元素
q.empty(); //判断队列是否为空
q.size(); //返回队列的元素个数
STL默认使用 < 操作符来确定对象之间的优先级关系(也就是从大到小排序,默认大根堆)。
priority_queue q; //默认大根堆
小根堆:
priority_queue,greater> q; //自定义小根堆
其中,第一个参数为数据类型,第二个参数为容器类型。第三个参数为比较函数。
结构体:需要重载运算符<
# include
#include
using namespace std;
struct orz{
int sum;
int x,y;
};
priority_queue q;
operator <(orz a,orz b){
return a.sum>b.sum;
}
int main(){
for (int i=1; i<=10; i++){
orz p;
p.x=i;
p.y=i;
p.sum=i;
q.push(p);
}
while (q.size()!=0){
orz p=q.top();
cout<
friend bool operator
struct Edge {
int u;
int v;
int w;
friend bool operator <(const Edge &x, const Edge &y)
{
return x.w > y.w;
}
};
Edge t[1000005];
priority_queue q;
优先队列的底层是用堆实现的。
在优先队列中默认存放数据的容器是vector,在声明时也可以用deque(双向队列)