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