c++容器适配器
介绍
c++标准库定义了三个顺序容器适配器:stack、queue和priorty_queue。
适配器是标准库中的一个通用概念。事实上适配器是一种机制,能使某种事物的行为看起来像一种不同的类型。
例如:stack接受一个顺序容器,并使其操作起来像stack一样
以下是所有容器适配器的通用操作和类型
| 操作/类型 | 含义 |
|---|---|
| size_type | 一种类型,足以保存当前类型的最大对象的大小 |
| value_type | 元素类型 |
| container_type | 实现适配器的底层容器类型 |
| A a | 创建一个名为a的空适配器 |
| A a(c) | 创建一个名为a的空适配器,带有容器c的一个拷贝 |
| 关系运算符 | 每个适配器都支持所有关系运算符:==、!=、<=、>=、>和<,这些运算符返回底层容器的运行结果 |
| a.empty() | 若a包含任何元素,返回false,否则返回true |
| a.size() | 返回a中包含的元素数目 |
| swap(a,b)/a.swap(b) | 交换ab的内容,ab必须有相同的类型,包括底层容器类型也必须相同 |
定义适配器
每个适配器都定义俩个构造函数:
- 默认构造函数创建一个空对象
- 接受一个容器的构造函数拷贝该容器来初始化适配器
例如,假定deg是一个deque<int>,我们可以用其来初始化stack如下stack<int> stk(deg)
默认情况下stack和queue是基于deque实现的,priorty_queue是在vector之上实现的。我们可以在创建一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。
1 | //在vector上实现的空栈 |
对于给定的适配器,可以使用哪些容器是有限制的。所有适配器都要求容器具有添加和删除元素的能力。
使用
栈适配器
stack类型定义在stack头文件中。
stack默认基于deque实现,也可以在list或vector上实现。
以下是stack的常用操作
| 操作 | 含义 |
|---|---|
| s.pop() | 删除栈顶元素,但不返回该元素值 |
| s.push(item)/s.emplace(arge) | 创建一个新元素压入栈顶,该元素通过拷贝或移动item而来,或者由args构造 |
| s.top() | 返回栈顶元素,但不将其弹出 |
队列适配器
queue和priority_queue适配器定义在queue头文件中。
queue默认基于deque实现,也可以用list或vector实现。
priority_queue默认基于vector实现,也可以用deque实现。
priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。
以下是常用操作
| 操作 | 含义 |
|---|---|
| q.pop() | 删除queue的首元素或priority_queue的最高优先级元素,但不返回 |
| q.front()/q.back() | 返回首元素或尾元素(只适用于queue) |
| q.top() | 返回最高优先级元素(只适用于priority_queue) |
| q.push(item)/q.emplace(args) | 在queue末尾或priority_queue中恰当位置创建一个元素,其值为item,或者由args构造 |