6.6 标准库类型:容器适配器

简介

除了顺序容器外,标准库还定义了三个顺序容器适配器:stackqueuepriority_queue。一个容器适配器接受一种已有的容器类型,使其行为看起来像是一种不同的类型。

容器适配器操作

所有容器适配器都支持的操作和类型如下:

操作或类型 含义 备注
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)
交换a和b的内容,a和b必须有相同类型,包括底层容器类型也必须相同

例子

Tips:默认情况下stack和queue是基于deque实现的,priority_queue是在vector之上实现的,我们可以在创建一个适配器时讲一个命名的顺序容器作为第二个类型参数来重载默认容器类型。

deque<int> deq;
stack<int> stk(deq);

// 在vector上实现的空栈
stack<string, vector<string>> str_stk;
// 在vector上实现的栈, 初始化时保存svec的拷贝
stack<string, vector<string>> str_stk2(svec);

适用范围

  • 所有适配器都要求容器具有添加、删除以及访问尾元素的能力,因此容器不能构造在arrayforward_list上构造适配器

  • stack只要求push_backpop_backback操作,因此可以在除arrayforward_list外的任何容器上构造

  • queue适配器要求backpush_backfrontpush_front,因此它可以构造于list或者queue上,但不能基于vector构造

  • priority_queue除了frontpush_backpop_back操作外还要求随机访问的能力,因此它可以构造于vectordeque之上,但不能基于list构造

栈适配器

Tips:栈默认基于deque实现,也可以在list或者vector

stack类型定义在stack头文件中,特属于stack的操作如下:

操作 含义 备注
s.pop() 删除栈顶元素,但不返回该元素值
s.push(item) 创建一个新元素压入栈顶,该元素通过拷贝或者item
s.emplace(args) 创建一个新元素压入栈顶,该元素
s.top() 返回栈顶元素,但不将该元素

队列适配器

queue默认基于deque实现,priority_queue默认基于vector实现;queue也可以用list或者vector实现,priority_queue也可以用deque实现

queuepriority_queue适配器定义在queue头文件中,特属于它们的操作如下:

操作 含义 备注
q.pop() 删除queue的首元素或者priority_queue最高优先级的元素,但不返回此元素
q.front() 返回首元素,但不删除此元素 只适用于queue
q.back() 返回尾元素,但不删除此元素 只适用于queue
q.top() 返回最高优先级元素,但不删除该元素 只适用于priority_queue
q.push(i) 在queue末尾或者priority_queue中恰当的位置创建一个元素,其
q.empalce(a) 在queue末尾或者priority_queue中恰当的位置创建一个元素,其由