C++入门
C++类和对象(上)
C++类和对象(中)
C++类和对象(下)
C/C++内存管理
C++string类
C++vector类
C++list类
文章目录
- 系列文章目录
- 一、stack是什么?
- 二、stack的使用
- 三、queue是什么?
- 四、queue的使用
- 五、优先级队列
- 六、优先级队列的使用
一、stack是什么?
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
二、stack的使用2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
| 函数说明 | 接口说明 |
|---|---|
| stack() | 构造函数不传参数构造一个空栈 |
| empty() | 判空 |
| size() | 返回元素个数 |
| top() | 返回栈顶元素 |
| push() | 压栈 |
| pop() | 出栈 |
1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
四、queue的使用2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
| 函数声明 | 接口说明 |
|---|---|
| queue() | 构造函数 |
| empty() | 判空 |
| size() | 返回元素个数 |
| front() | 返回队头元素 |
| back() | 返回队尾元素 |
| push() | 入队 |
| pop() | 出队 |
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。
3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
其实优先级队列就是堆。
六、优先级队列的使用| 函数声明 | 接口说明 |
|---|---|
| priority_queue() | 构造函数 |
| empty() | 判空 |
| top() | 返回优先级队列中最大或最小元素,即堆顶元素 |
| push() | 入队 |
| pop() | 最大或最小元素出队, 即堆顶元素 |
#include#include #include // greater算法的头文件 void TestPriorityQueue() { // 默认情况下,创建的是大堆,其底层按照小于号比较 vector v{3,2,7,6,0,4,1,9,8,5}; priority_queue q1; for (auto& e : v) q1.push(e); cout << q1.top() << endl; // 如果要创建小堆,将第三个模板参数换成greater比较方式 priority_queue , greater > q2(v.begin(), v.end()); cout << q2.top() << endl; }
这段代码的倒数第二行好像很复杂,我们来仔细分析一下:
上图是优先级队列的模板参数,第一个参数是类型, 第二个参数是容器适配器,第三个参数是仿函数。
给大家进行一个简单的说明,容器适配器可以自己选定已有的容器。比如我定义一个类,第一个实例化用vector比较合适我就vector,但是第二个实例化用list更好,我就可以传list.
仿函数其实是一个类的成员函数的重载,必须实例化出一个对象才能使用。如下:
templateclass greater { public: bool operator()(const T& x, const T& y) { return x > y; } };
这个类中重载了()操作符。
template, class Compare = less > class priority_queue { public: //大根堆 void adjustUp() { Compare com; //使用仿函数前要先实例化出一个对象 size_t child = _con.size() - 1; size_t parents = (child - 1) >> 1; while (child > 0) { if (com(_con[parents], _con[child])) { std::swap(_con[child], _con[parents]); child = parents; parents = (child - 1) >> 1; } else { break; } } }
以上是模拟实现优先级队列的一部分,可以看到,使用仿函数前要先实例化出一个对象。同时,如果对第一行模板参数中的关键字typename不了解的可以看这篇文章:typename前缀



