queue
先进先出队列
template <class T, class Container = deque<T> > class queue;
T:元素类型
Container:容器类型,可省,默认deque
empty():判断队列是否为空
size()返回队列的大小
front()返回队列的队首元素
back()返回队列的队尾元素
pop()移除队列的队首元素
push(val)将val压入队尾
emplace(args)构造元素并插入队尾,push是已经构造好的
push和emplace的区别看下图。如果val是一个结构体的话,下图的pd1.emplace(i,j)不报错,但是pd1.push((i,j))会报错,因为emplace可以直接把(i,j)构造成一个node,但push不行
priority_queue
优先队列,用top来代替front,其余同上
改变优先队列的排序方式
优先队列默认排序方式是队首元素最大,如果想简单的改变数据类型为int的队列的排序方式为队首元素最小,可直接用默认的greater,如下
队首为队列中最大元素
priority_queue<int> sort_seq;
队首为队列中最小元素
priority_queue<int,vector<int>,greater<int>> sort_seq;
若数据类型不是简单的int,而是结构体
#include<iostream>
#include<queue>
using namespace std;
struct node{
int x;
int y;
node(){}
node(int _x,int _y):x(_x),y(_y){}
};
struct cmp1{
bool operator ()(node a,node b){
if(a.x==b.x){
return a.y<b.y;
}
return a.x<b.x;
}
};
struct cmp2{
bool operator ()(node a,node b){
if(a.x==b.x){
return a.y>b.y;
}
return a.x>b.x;
}
};
int main(){
priority_queue<node,vector<node>,cmp1> pq1;
priority_queue<node,vector<node>,cmp2> pq2;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
pq1.emplace(i,j); //emplace构造一个对象node
pq2.emplace(i,j);
}
}
printf("pq1 从大到小\n");
while(!pq1.empty()){
printf("%d %d\n",pq1.top().x,pq1.top().y);
pq1.pop();
}
printf("pq1 从小到大\n");
while(!pq2.empty()){
printf("%d %d\n",pq2.top().x,pq2.top().y);
pq2.pop();
}
return 0;
}