C++基础之适配器
什么是容器适配器?
”适配器是使一种事物的行为类似于另外一种事物行为的一种机制”,适配器对容器进行包装,使其表现出另外一种行为。例如,stack<int, vector<int> >实现了栈的功能,但其内部使用顺序容器vector<int>来存储数据。(相当于是vector<int>表现出了栈的行为)。
标准库提供了三种顺序容器适配器:queue(FIFO队列)、priority_queue(优先级队列)、stack(栈)。
| 种类 | 默认顺序容器 | 可用顺序容器 | 说明 |
| 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<string> > str_stk;
stack< string, vector<string> > 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,在基于优先级的适当位置插入新元素 |
C++基础之适配器的更多相关文章
- Android零基础入门第42节:自定义BaseAdapter
原文:Android零基础入门第42节:自定义BaseAdapter 在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不 ...
- Android笔记——BaseAdapter的使用
Android中的适配器(Adapter)是数据与视图(View)之间的桥梁,用于对要显示的数据进行处理,并通过绑定到组件进行数据的显示. BaseAdapter是Android应用程序中经常用到的基 ...
- EmberJs之使用Ember-Data
写在前面 最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客.常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要 ...
- Android基础类之BaseAdapter
转:http://www.cnblogs.com/mandroid/archive/2011/04/05/2005525.html Android基础类之BaseAdapter BaseAdapter ...
- Adapter的getView方法详解
来自:http://blog.csdn.net/yelbosh/article/details/7831812 BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是 ...
- Xamarin.Android 入门之:Listview和adapter
一.引言 不管开发什么软件,列表的使用是必不可少的,而本章我们将学习如何使用Xamarin去实现它,以及如何使用自定义适配器.关于xamarin中listview的基础和适配器可以查看官网https: ...
- android ListView用法介绍
ListView在Android开发中是比较常用的组件,它是以列表的形式展示内容,并且还可以处理用户的选择与点击等操作: LIstView显示数据一般需要三方面: (1)ListView组件:用来展示 ...
- 第29讲 UI组件之 ListView与 BaseAdapter,SimpleAdapter
第29讲 UI组件之 ListView与 BaseAdapter,SimpleAdapter 1.BaseAdapter BaseAdapter是Android应用程序中经常用到的基础数据适配器,它的 ...
- 第28讲 UI组件之 ListView和ArrayAdapter
第28讲 UI组件之 ListView和ArrayAdapter 1. Adapter 适配器 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的 ...
随机推荐
- LoRa硬件调试-前导码
前言 已知LoRa数据包在负载之前会有一段前导码,接收端是先检测前导码,收到前导码之后才认为有数据发送过来. 那么不同的前导码的长度会有什么影响呢? 前导码长短的优劣势 - 前导码实际上是占符号的,也 ...
- 学习Lowdb小型本地JSON数据库
Lowdb是轻量化的基于Node的JSON文件数据库.对于构建不依赖服务器的小型项目,使用LowDB存储和管理数据是非常不错的选择. 一:lowdb 使用及安装 在项目中的根目录安装 lowdb 命令 ...
- rabbitmq生产者的消息确认
通过Publisher Confirms and Returns机制,生产者可以判断消息是否发送到了exchange及queue,而通过消费者确认机制,Rabbitmq可以决定是否重发消息给消费者,以 ...
- cocos creator 事件
cocos creator 事件 在做一个消除类游戏时,需要对点击的方块做出响应.代码很简单,可背后的原理还多着呢. 1. 普通节点注册click事件 在cc中如果需要相应click事件,需要为该节点 ...
- 企查查app新增企业数据抓取
企查查每日新增企业数据抓取尚未完成的工作: 需要自行抓包获取设备id,appid,sign等等 sign和时间戳保持一致即可 把所有的数据库.redis配置 无法自动登录,账号需要独立 redis数据 ...
- MySQL之主从同步
一.主从同步概念 1.1 什么是主从同步? MySQL 主从同步是指将数据从一个 MySQL 数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器 ...
- python request接口测试笔记(1)
python request接口测试笔记(1) 涉及到的功能说明: 需要登录拿到token,才能进行下一个接口的请求 读取csv文件中的信息,作为接口的参数 将接口响应结果,写入csv文件,以便分析统 ...
- JavaWeb实现增删查改(图书信息管理)——之查询
关于此次CRUD所需要的jar包,本人把文件放在了百度网盘,需要的自行去下载: 链接:https://pan.baidu.com/s/1Pqe88u6aPaeVjjOq1YFQ-w 提取码:pim ...
- Linux下手动安装JDK
一.删除自带的JDK 查询系统自带JDK rpm -qa | grep java rpm -qa | grep jdk 删除查询出来的文件名 rpm -e --nodeps 文件名 命令执行成功后重新 ...
- UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 16: illegal multibyte sequence
报错 UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 16: illegal multibyte sequence ...