
概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。
一个模板容器适配器类,它提供功能的限制,限制对一些基本容器类型的前端和后端元素的访问权限。 可以在后端添加或从前端移除元素,并且可以在队列的任何一端检查元素。
适用于队列的基础容器类包括 deque 和 list
队列容器允许从一端新增元素,从另一端移除元素
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
队列中进数据称为 — 入队 push
队列中出数据称为 — 出队 pop
2 函数备注
队列的默认基容器是 deque。 还可以指定列表作为基容器,但不能指定矢量,因为它缺少所需的 pop_front 成员函数。
一个模板容器适配器类,它提供功能的限制,限制一些基本容器类型顶端元素的访问权限,并且该类通常为最大类或具有最高优先级。 可以将新元素添加到 priority_queue,并且可以检查或删除 priority_queue 的顶级元素。
一种提供函数对象的类型,该函数对象将两个元素值作为排序键进行比较,以确定其在 priority_queue 中的相对顺序。 此参数为可选自变量,默认值是二元谓词 less
适用于 Priority_queue 的基础容器类包括deque 类和默认的 vector 类,或任何支持 front、push_back、pop_back 的 *** 作和随机访问迭代器的其他序列容器。 基础容器类封装在容器适配器中,容器适配器仅公开一组有限的序列容器成员函数为公共接口。
C++ 标准库定义了三种类型的容器适配器:stack、queue 和 priority_queue。 每种适配器都限制了一些基础容器类的功能,以便对标准数据结构提供精确控制的接口。
-
堆栈 类 支持后进先出 (LIFO) 数据结构。 可以在脑海中将其类比为一摞盘子。 元素(盘子)只能从堆栈顶部(基容器末尾的最后一个元素)插入、检查或删除。 限制仅访问顶部元素是使用堆栈类的原因。
-
队列 类 支持基于数据结构的 FIFO (先) 先出。 可以在脑海中将其类比为排队等候银行柜员的人。 元素(人)可从行的后部添加,并且可以从行的前部删除。 行的前部和后部都可以插入。 以这种方式限制仅访问前部和后部元素是使用队列类的原因。
-
Priority_queue 类将对其元素进行排序,以便最大的元素始终位于顶部位置。 它支持元素的插入以及顶部元素的检查和删除。 可以在脑海中将其类比为按年龄、身高或其他标准排队的人。
详细示例https://docs.microsoft.com/zh-cn/cpp/standard-library/priority-queue-class?view=msvc-160
定义:priority_queue
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。
- 基本类型例子:
#include#include using namespace std; int main() { //对于基础类型 默认是大顶堆 priority_queue a; //等同于 priority_queue , less > a; priority_queue , greater > c; //这样就是小顶堆 priority_queue b; for (int i = 0; i < 5; i++) { a.push(i); c.push(i); } while (!a.empty()) { cout << a.top() << ' '; a.pop(); } cout << endl; while (!c.empty()) { cout << c.top() << ' '; c.pop(); } cout << endl; b.push("abc"); b.push("abcd"); b.push("cbd"); while (!b.empty()) { cout << b.top() << ' '; b.pop(); } cout << endl; return 0; }
输出
4 3 2 1 0 0 1 2 3 4 cbd abcd abc
- pari的比较,先比较第一个元素,第一个相等比较第二个
#include#include #include using namespace std; int main() { priority_queue > a; pair b(1, 2); pair c(1, 3); pair d(2, 5); a.push(d); a.push(c); a.push(b); while (!a.empty()) { cout << a.top().first << ' ' << a.top().second << 'n'; a.pop(); } }
输出
2 5 1 3 1 2
- 对于自定义类型
#include#include using namespace std; //方法1 struct tmp1 //运算符重载< { int x; tmp1(int a) {x = a;} bool operator<(const tmp1& a) const { return x < a.x; //大顶堆 } }; //方法2 struct tmp2 //重写仿函数 { bool operator() (tmp1 a, tmp1 b) { return a.x < b.x; //大顶堆 } }; int main() { tmp1 a(1); tmp1 b(2); tmp1 c(3); priority_queue d; d.push(b); d.push(c); d.push(a); while (!d.empty()) { cout << d.top().x << 'n'; d.pop(); } cout << endl; priority_queue , tmp2> f; f.push(c); f.push(b); f.push(a); while (!f.empty()) { cout << f.top().x << 'n'; f.pop(); } }
输出
3 2 1 3 2 1
参考代码原文链接:https://blog.csdn.net/weixin_36888577/article/details/79937886
示例链接https://docs.microsoft.com/zh-cn/cpp/standard-library/priority-queue-class?view=msvc-160#syntax
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)