你已经学过队列的数据结构了,所以队列的概念不再赘述。如果对数据结构队列不了解的,请先补相应课程。
STL 的队列是数据结构的队列的工程实现,所以,如果你理解了队列是什么,学 STL 就很容易,你只需要知道有 STL 里有哪几种队列的容器,你的程序需要什么功能就选哪一种队列容器,然后,会用这个容器下面的函数就可以了。
所以,下面直接就介绍几种容器。
1 queue
queue 模板严格遵循数据结构关于队列的定义:队列有队头,有队尾。新的元素只能从尾部进入,也只能弹出队尾的元素。
queue 容器的方法
-
push , 把一个元素放入队尾
-
front,返回队首的元素(只返回队首元素,不弹出)
-
back,返回队尾的元素(只返回队尾元素,不弹出)
-
pop,弹出队首元素
-
size,返回队列内元素的个数
-
empty,返回一个 bool 值,如果队列为空返回 true,如果队列还有内容返回 false
2 deque
deque 是一种特殊的队列,它是两端都能进,两端都能出的。
-
push_back , 把一个新元素从尾端放入
-
push_front , 把一个新元素从前端放入
-
front,返回队首的元素(只返回队首元素,不弹出)
-
back,返回队尾的元素(只返回队尾元素,不弹出)
-
pop_front,弹出队首元素
-
pop_back,弹出队尾元素
-
size,返回队列内元素的个数
-
empty,返回一个 bool 值,如果队列为空返回 true,如果队列还有内容返回 false
3 priority_queue
priority_queue 的方法(函数)和 queue 一模一样,意思也基本一样,只需要了解 priority_queue 的特性就足够了。
priority_queue 是优先队列,其实这个东西和队列差别挺大的。有几个关键点:
-
优先队列内的元素是经过排序的,这个排序和我们过去学的排序有一些不一样,它只保证优先级最高的那一个是对的。比方说,你希望对一堆学生按成绩排序,你永远都只关心最高分的那个,至于第二高分第三高分你不关心。而这个优先级最高的元素,在 priority_queue 里面是队首。STL 帮你排序排好了的,你不用关心它怎么排(它怎么排,将来我们要学,对应的知识叫堆排序)
-
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 的输入流符号。