除了顺序容器外,标准库还定义了三个顺序容器适配器:stack
、queue
、priority_queue
。
适配器是标准库中的一个通用概念,容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。
定义一个适配器
每个适配器都定义两个构造函数:
- 默认的构造函数创建一个空的对象。
- 接受一个容器的构造函数拷贝该容器来初始化适配器。
默认情况下,stack
和 queue
是基于 deque
实现的,priority_queue
是在 vector
之上实现的。
可以在创建一个适配器时将一个命名的顺序容器作为第二个参数来重载默认容器类型。
//在vector上实现的空栈
stack<string, vector<string>> str_stk;
//str_stk2在vector上实现,初始化时保存svec的拷贝
stack<string, vector<string>> str_stk2(svec);
对于一个给定的适配器,可以使用哪些容器是有限制的。
- 所有容器都要有添加和删除元素的能力,因此,适配器不能构建在
array
之上。类似的,也不能用forward_list
来构造容器适配器,因为所有适配器都要求容器具有添加、删除以及访问尾元素的能力。 stack
只要求push_back
、pop_back
和back
操作,因此可以使用除array
和forward_list
之外的任何容器类型来构造。queue
要求back
、push_back
、front
、push_front
,因此它可以构建在list
和deque
之上,但不能基于vector
构造。priority_queue
除了front
、push_back
、pop_back
操作之外还要求随机访问能力,因此可以构造于vector
或queue
之上,但不能基于list
构造。
每个容器适配器都基于底层容器类型的操作定义自己的特殊操作,使用时只可以使用适配器操作,而不能使用底层容器类型的操作。
栈适配器
stack
类型定义在 stack
头文件中。
stack<int> intStack;
for (size_t ix = 0; ix != 10; ++ix)
intStack.push(ix);
while (!intStack.empty())
{
int value = intStack.top();
intStack.pop();
}
队列适配器
queue
和 priority_queue
适配器定义在 queue
头文件中。
priority_queue
允许在队列中的元素创立优先级。新加入的元素会安排在所有优先级比它低的已有元素之前。默认情况下,标准库在元素类型上使用 <
运算符来确定相对优先级。