队列(queue)是一种具有「先进入队列的元素一定先出队列」性质的表。由于该性质,队列通常也被称为先进先出(first in first out)表,简称 FIFO 表。
C++ STL 中实现了 队列 std::queue
和 优先队列 std::priority_queue
两个类,定义于头文件 <queue>
中。
队列(queue)
std::queue
是容器适配器,默认的底层容器为双端队列std::deque
。
q.empty() 如果队列为空返回true,否则返回false
q.size() 返回队列中元素的个数
q.pop() 删除队列首元素但不返回其值
q.front() 返回队首元素的值,但不删除该元素
q.push() 在队尾压入新元素
q.back() 返回队列尾元素的值,但不删除该元素
优先队列(priority_queue)
priority_queue
和queue
不同的就在于可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。
优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
q.top() 访问队头元素
q.empty() 队列是否为空
q.size() 返回队列内元素个数
q.push() 插入元素到队尾 (并排序)
q.emplace() 原地构造一个元素并插入队列
q.pop() 弹出队头元素
q.swap() 交换内容
定义:priority_queue<Type, Container, Functional>
Type
就是数据类型,Container
就是容器类型(Container
必须是用数组实现的容器,比如vector
,deque
等等,但不能用list
。STL
里面默认用的是vector
),Functional
就是比较的方式。当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
一般是:
//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
自定义数据类型和比较规则:
struct TMP{
int x;
string s;
TMP( int a= 0, string b= "" ):
x(a), s(b) {}
};
struct cmp{
bool operator () ( TMP a, TMP b ){//返回true,a的优先级大于b
//x大的排在队前部;x相同时,y大的排在队前部
if( a.x== b.x ) return a.s< b.s;
return a.x> b.x;
}
};
priority_queue<TMP ,vector<TMP>,cmp > ans;
[参考链接]
https://www.cnblogs.com/huashanqingzhu/p/11040390.html
https://blog.csdn.net/u014609638/article/details/106987131
https://oi-wiki.org/ds/queue/