C++STL之队列Queue及优先级队列priority_queue回顾

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43269048/article/details/99827303

写在前面:最近在做算法练习题,之前遇到的队列问题都是自己做数组来解决,但是十分麻烦,因此在这里系统回顾一下C++的队列及优先级队列的使用方法。

Queue翻译为队列,具有先进先出(First In First Out)的特性,即先入队的先出队,类比于超市排队结账,在BFS等方面有很大的便捷性。优先级队列priority_queue则是让队列中的某些具有优先条件的元素先出队,即队列中优先级别高的先出队,而不是先入队的先出队,即允许了“急诊病人插队”这样的事情存在,两者均定义于头文件中,基本使用方法除了front()和top()外基本相同。**

#include <queue> //首先两者都需要使用头文件

常用方法:

  1. push( x ) 将元素x入队,加入到队尾 时间复杂度为O(1)
  2. front( ) 返回队首,在队列中使用 时间复杂度为O(1)
  3. top( ) 返回优先级最高的元素,在优先队列中使用
  4. pop( ) 队首出队 时间复杂度为O(1)
  5. back( ) 返回元素尾 时间复杂度为O(1)
  6. size( ) 返回队列中的元素个数 时间复杂度为O(n)
  7. empty( ) 判断队列是否为空 时间复杂度为O(1)

普通队列图解如下:

队列图解
对于队列的示例应用,见于对算法团体队列问题的解析,团体队列问题

重点讲一下优先级队列
优先队列容器和队列一样,只能从队尾插入元素,从队首删除元素,也定义于< queue >头文件中。
优先级队列不同于普通队列的一个特性,就是优先级队列中优先级最大的元素总是位于队首,所以出队时,并不是完全一样的遵循先进先出的原则来进行的,而是将队列中优先级最大的元素出队。这点有点儿类似于给队列里元素先进行一个排序,再按照顺序出队。元素的比较规则默认按照元素值由大到小排序,自定义类型也可以组成优先队列,但必须为每个元素定义一个优先级,只要能比较大小即可的优先级,(和sort非常相似的比较规则)我们可以重载 “<” 操作符来重新定义比较规则。
声明方式:

  priority_queue<int> a; //默认为越小的整数优先级越低的优先队列

  priority_queue<vector<int>,less<int> >  a1;    //使用递增less<int> 函数对象排序

  priority_queue<deque<int>,greater<int> > a2 ;    //使用递增greater<int>函数对象排序
  //注意,最后两个>>不要写到一起,否则会被很多编译器认为是>>运算符。

自定义方式比较优先级
例如,要实现一个“个位数大的整数优先级反而小”的优先队列,可以定义一个结构体cmp,重载()运算符,然后用 priority_queue<int,vector,cmp> pq 的方式定义,下面是这个cmp的定义:

struct cmp{
	bool operator()(const int a,const int b) const {
		//a的优先级比b小时返回true
		return a % 10 > b % 10 ; 
	}
};

猜你喜欢

转载自blog.csdn.net/qq_43269048/article/details/99827303