最近整理了一下C++总常用的STL,由于匆忙,如有错误,欢迎指正。
优先队列 priority_queue
关于优先队列,它的实现就是数据结构的大顶堆跟小顶堆,如有疑问可自行百度,不在做说明。
优先队列的基本用法跟队列没什么两样,不同的是queue的取队首元素为q.front()而priority_queue是q.top(),并且优先队列可以根据自定义来实现队列中元素的排序,其原理就是利用堆排序,其复杂度为O(logn)。
基本操作:
empty() 如果队列为空,则返回真
pop() 删除对顶元素,删除第一个元素
push() 加入一个元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列对顶元素,返回优先队列中有最高优先级的元素
声明方式:
priority_queue <int> q //其相当于priority_queue <int ,vector<int>,less<int> > 数值大的先出(默认为大顶堆)
priority_queue <int,vector<int>,greater<int> > //其排序规则是数值小的先出
自定义优先级:
struct cmp {
bool operator ()(int x, int y)
{
return x > y;
}
};
priority_queue<int, vector<int>, cmp> q; //定义方法
结构体声明方式:
typedef struct node
{
int x,y;
bool operator < (const node &a) const
{
return x < a.x;//其排序规则为x小的小
}
}node;
priority_queue<node>q; //定义方法
实例:
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int x,y;
bool operator < (const node &a) const
{
return x!=a.x?x<a.x:y<a.y;
}
}node;
int main()
{
priority_queue <node> q;
for(int i = 1;i <= 3;i++)
{
node t;
scanf("%d%d",&t.x,&t.y);
q.push(t);
}
while(!q.empty())
{
node t = q.top();
q.pop();
cout<<t.x<<" "<<t.y<<endl;
}
return 0;
}
双端队列 deque
其实双端队列我更认为应该叫做双端栈(瞎起的名字),因为它像是一个两头的栈,它的原则是后进先出,而队列是先进先出
本操作:
push_back(x)/push_front(x)//把x压入后/前端
back()/front() //访问(不删除)后/前端元素
pop_back() pop_front() //删除后/前端元素
empty() //判断deque是否空
size() //返回deque的元素数量
clear(