9.7 容器适配器
顺序容器适配器主要分三类:
思考:有没有关系容器适配器?
| No. | Container Adaper | 容器适配器 | 头文件 | 默认基础容器 | 可适配类型 | 适配条件 |
|---|---|---|---|---|---|---|
| 1 | stack |
栈 | stack |
deque |
vectot,list,deque
|
任意顺序容器 |
| 2 | queue |
队列 | queue |
deque |
list |
必须提供push_front运算 |
| 3 | priority_queue |
优先级队列 | queue |
vector |
vector,deque
|
随机访问 |
思考:queue默认基础容器是deque,为什么不能适配deque?
- 通用类型
| No. | Type | Mean |
|---|---|---|
| 1 | size_type |
适配器长度类型 |
| 2 | value_type |
元素类型 |
| 3 | container_type |
基础容器类型 |
- 通用操作(初始化+关系运算)
-
默认基础容器类型初始化
基本初始化方式:- 空适配器:
A a; - 复制容器c元素的适配器:
A a(c);
例如:
- 空适配器:
stack<int> oTestStk1;// 等同于stack<int,deque<int> > oTestStk1;
stack<int> oTestStk2(dep);// 等同于stack<int,deque<int> > oTestStk2(dep);
- 覆盖基础容器类型初始化
覆盖上面基础容器类型,例如:利用vector<int>覆盖stack默认的deque<int>
stack<int,vector<int> > oTestStk1;
stack<int,vector<int> > oTestStk2(vec);
思考:什么应用场景下,需要覆盖基础容器类型?
- 关系运算
支持关系运算:==,!=,>,>=,<,<=
使用关系运算要求元素支持==和<两个运算符。
思考:不同类型的Container Adaper关系运算,是如何执行的呢?例如:stack与queue
9.7.1 栈适配器
-
stack的基本操作
stack是后进先出LIFO
| No. | Operation | Mean |
|---|---|---|
| 1 | s.empty() |
是否为空 |
| 2 | s.size() |
元素个数 |
| 3 | s.top |
返回栈顶元素,不删除 |
| 4 | s.pop |
删除栈顶元素,不返回 |
| 5 | s.push(elem) |
栈顶压入新元素 |
虽然stack的默认基础容器是deque,但是,不再支持deque独有的方法。例如,stack不再支持deque的push_back方法,取而代之的是push方法。
9.7.2 队列和优先级队列
STL两类队列:FIFO先进先出的queue和检索策略的priority_queue。
其中,priority_queue可以实现边插入变排序,要求元素支持<运算。
-
stack的基本操作
| No. | Operation | Mean |
|---|---|---|
| 1 | q.empty() |
是否为空 |
| 2 | q.size() |
元素个数 |
| 3 | q.top |
返回队首元素,不删除,只适用priority_queue
|
| 4 | q.pop |
删除队首元素,不返回 |
| 5 | q.push(elem) |
queue队未压入新元素;priority_queue根据优先级插入新元素 |
| 6 | q.front() |
返回队首元素,不删除,只适用queue
|
| 7 | q.back() |
返回队未元素,不删除,只适用queue
|
收获
本节主要讲解Container Adapter的最基本用法。
通用类型
size_type,value_type,container_type-
通用操作
- 默认初始化
- 覆盖基础容器类型的初始化
- 关系运算
- 其他操作(这些操作算是共通的,作者没有归到通用,不知为啥)
a.empty(),a.size()
-
特殊操作
stack、queue和priority_queue有很多接口形式上是一致的,只是效果不同。stack是后进先出LIFO,queue是先进先出FIFO,priority_queue是优先级高的先出。
| Methed | Common | stack |
queue |
priority_queue |
|---|---|---|---|---|
top() |
取元素,不删除 | 取栈顶 | 不适用 | 取取首 |
pop() |
删除元素,不取 | 删栈顶 | 删队首 | 删队首 |
push(elem) |
压入元素 | 压栈底 | 压队未 | 根据优先级插入 |
queue有自己特有的两个方法front()和back(),又不支持pop()。

stack、queue与priority_queue存取操作比较
思考
- 1.有没有关系容器适配器?
- 2.
queue默认基础容器是deque,为什么不能适配deque? - 3.什么应用场景下,需要覆盖基础容器类型?
- 4.不同类型的Container Adaper关系运算,是如何执行的呢?例如:
stack与queue
[](##### 习题)
[](* 9.42)
[](* 9.43)