博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++基础之适配器
阅读量:6544 次
发布时间:2019-06-24

本文共 1713 字,大约阅读时间需要 5 分钟。

什么是容器适配器?

”适配器是使一种事物的行为类似于另外一种事物行为的一种机制”,适配器对容器进行包装,使其表现出另外一种行为。例如,stack<int, vector<int> >实现了栈的功能,但其内部使用顺序容器vector<int>来存储数据。(相当于是vector<int>表现出了栈的行为)。

标准库提供了三种顺序容器适配器:queue(FIFO队列)、priority_queue(优先级队列)、stack(栈)。

要使用适配器,需要加入一下头文件:
#include <stack>        //stack
#include<queue>       //queue、priority_queue
种类 默认顺序容器 可用顺序容器 说明
stack deque vector、list、deque  
queue deque list、deque 基础容器必须提供push_front()运算
priority_queue vector vector、deque 基础容器必须提供随机访问功能

注意,适配器都有自己默认实现的容器,,当然也可以自己指定。具体如上表。

适配器通用的操作和类型

名称 意义
size_type

一种类型,足以存储此适配器类型最大对象的长度

value_type 元素类型
container_type 基础容器的类型,适配器在此容器类型上实现
A a; 创建一个新空适配器,命名为 a
A a(c); 创建一个名为 a 的新适配器,初始化为容器 c 的副本
关系操作符

所有适配器都支持全部关系操作符:==、 !=、 <、 <=、 >、>=

 

默认的stack和queue都基于deque容器实现,而priority_queue则在vector容器上实现。在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型实参,可覆盖其关联的基础容器类型:

stack< string, vector
> str_stk;stack< string, vector
> str_stk(svec);

对于给定的适配器,其关联的容器必须满足一定的约束条件:

所有的适配器都要求容器具有添加和删除元素的能力,所以不能建立在array之上;也不能建立在forward_list之上,因为,适配器还要求访问尾元素的能力;

stack适配器所关联的基础容器可以是任何一种顺序容器类型。stack可以建立在vector、list、deque容器之上;

queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list和deque容器上,而不能建立在vector容器上。

priority_queue适配器要求提供随机访问功能,因此可建立vector或deque容器上,但不能建立在list容器上。

栈适配器

操作 描述
s.empty() 如果栈为空,返回true,否则返回false
s.size() 返回栈中元素的个数
s.pop()  删除栈顶元素,但不返回其值
s.top() 返回栈顶元素,但不删除其值
s.push(item) 在栈顶压入新元素

队列和优先级队列

操作 描述
q.empty() 如果对列为空,返回true,否则返回false
q.size() 返回队列中元素的个数
q.pop() 删除队列首元素,但不返回其值
q.front() 返回队列首元素的值,但不删除该元素;该操作适用于queue而非priority_queque
q.back() 返回队尾元素的值,而不删除该元素;该操作适用于queue而非priority_queque
q.top() 返回具有最高优先级的元素值,但不删除该元素;该操作适用于priority_queque
q.push(item) 对于queue,在队尾压入一个新元素;对于priority_queue,在基于优先级的适当位置插入新元素

 

转载于:https://www.cnblogs.com/yeqluofwupheng/p/6711265.html

你可能感兴趣的文章
zabbix从2.2.3升级到最新稳定版3.2.1
查看>>
我有一个网站,想提高点权重
查看>>
浅谈(SQL Server)数据库中系统表的作用
查看>>
微软邮件系统Exchange 2013系列(七)创建发送连接器
查看>>
程序员杂记系列
查看>>
【树莓派】制作树莓派所使用的img镜像(一)
查看>>
理解网站并发量
查看>>
spring整合elasticsearch之环境搭建
查看>>
TensorFlow 架构与设计-编程模型【转】
查看>>
如何运行Struts2官网最新Demo?
查看>>
'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
查看>>
XDebug 教程
查看>>
js 去html 标签
查看>>
好久不见
查看>>
小tips:JS中的children和childNodes
查看>>
二叉树的遍历
查看>>
Oracle的FIXED_DATE参数
查看>>
NDK配置
查看>>
(转)@ContextConfiguration注解说明
查看>>
[置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)...
查看>>