第六章 标准库类型

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中恰当的位置创建一个元素,其由
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值