STL队列2

你已经学过队列的数据结构了,所以队列的概念不再赘述。如果对数据结构队列不了解的,请先补相应课程。

STL队列-优快云博客

STL 的队列是数据结构的队列的工程实现,所以,如果你理解了队列是什么,学 STL 就很容易,你只需要知道有 STL 里有哪几种队列的容器,你的程序需要什么功能就选哪一种队列容器,然后,会用这个容器下面的函数就可以了。

所以,下面直接就介绍几种容器。

1 queue

queue 模板严格遵循数据结构关于队列的定义:队列有队头,有队尾。新的元素只能从尾部进入,也只能弹出队尾的元素。

queue 容器的方法

  1. push , 把一个元素放入队尾

  2. front,返回队首的元素(只返回队首元素,不弹出

  3. back,返回队尾的元素(只返回队尾元素,不弹出

  4. pop,弹出队首元素

  5. size,返回队列内元素的个数

  6. empty,返回一个 bool 值,如果队列为空返回 true,如果队列还有内容返回 false

2 deque

deque 是一种特殊的队列,它是两端都能进,两端都能出的。

  1. push_back , 把一个新元素从尾端放入

  2. push_front , 把一个新元素从前端放入

  3. front,返回队首的元素(只返回队首元素,不弹出

  4. back,返回队尾的元素(只返回队尾元素,不弹出

  5. pop_front,弹出队首元素

  6. pop_back,弹出队尾元素

  7. size,返回队列内元素的个数

  8. empty,返回一个 bool 值,如果队列为空返回 true,如果队列还有内容返回 false

3 priority_queue

priority_queue 的方法(函数)和 queue 一模一样,意思也基本一样,只需要了解 priority_queue 的特性就足够了。

priority_queue 是优先队列,其实这个东西和队列差别挺大的。有几个关键点

  1. 优先队列内的元素是经过排序的,这个排序和我们过去学的排序有一些不一样,它只保证优先级最高的那一个是对的。比方说,你希望对一堆学生按成绩排序,你永远都只关心最高分的那个,至于第二高分第三高分你不关心。而这个优先级最高的元素,在 priority_queue 里面是队首。STL 帮你排序排好了的,你不用关心它怎么排(它怎么排,将来我们要学,对应的知识叫堆排序

  2. priority_queue 的优点在于它基于堆排序算法,永远都能确定优先级最高的那个元素,你如果把队首元素弹出了,它马上就能把下一个优先级最高的给放到队首;假设你放一个新的元素进队列,它也能更新,始终确保队首的那个就是优先级最高的。

那么,问题就来了,有时候你希望最小的排前面,有时候你希望最大的排前面,程序怎么写。下面提供一些常用的例子,大家要背一下的。

第一个是针对 int 或者 long long 这种基本数据类型的,就用下面这两种定义格式:

priority_queue <int, vector<int>, less<int> > q1;
priority_queue <int, vector<int>, greater<int> > q2;

priority_queue <long long, vector<long long>, less<long long> > q3;
priority_queue <long long, vector<long long>, greater<long long> > q4;

正面格式中,最大的尖括号中分了 3 段,第一段表示数据类型,第二段表示把这些数据放入一个什么样的容器当中(我们都习惯放入动态素组 vector 里面,这个死机就可以了),第三个是排序的优先级设定。

less 的英文是更小的意思,所以 less and less 就是越来越小。所以如果这里用了 less,表示队首是最大的,后面是越来越小的。

greater 的英文是更大的意思,所以 greater and greater 就是越来越大。所以如果这里用了 greater,表示队首是最小的,后面是越来越大的。

加入这个队列是一个你自己定义的结构体类型的,你又想实现按照某种优先级顺序进行排列,那么就参考下面这段代码。你需要定义 < 运算符,优先队列会按照这个比较规则进行排序,最小的放在队首。

struct Point{
	int x,y;// 点的横坐标和纵坐标 
	bool operator < (const Point& other) const{
		return x<other.x||(x==other.x&&y<other.y);
		// 优先看 横坐标,横坐标相同 看纵坐标 
	};
};
priority_queue <Point, vector<Point> > q5;

特别注意,在定义的时候,两个右尖括号不能挨在一起,中间要有空格,否则编译器就会一位是 cin 的输入流符号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值