1. 适配器简介

在详解什么是容器适配器之前,初学者首先要理解适配器的含义。

其实,容器适配器中的“适配器”,和生活中常见的电源适配器中“适配器”的含义非常接近。我们知道,无论是电脑、手机还是其它电器,充电时都无法直接使用 220V 的交流电,为了方便用户使用,各个电器厂商都会提供一个适用于自己产品的电源线,它可以将 220V 的交流电转换成适合电器使用的低压直流电。

从用户的角度看,电源线扮演的角色就是将原本不适用的交流电变得适用,因此其又被称为电源适配器。

2. 容器适配器

简单理解 容器适配器, 就是将不适用的序列式容器 (包括vector, deque, list ) 变得适用

即通过封装某个序列式容器,并重新组合该容器中包含的成员函数, 使其满足某些特定场景的需要;

2.1 适配器举例

举一个例子,假设一个代码模块 A,它的构成如下所示:


class A{public:void f1(){}void f2(){}void f3(){}void f4(){}
};

现在我们需要设计一个模板 B,但发现,其实只需要组合一下模块 A 中的 f1()、f2()、f3(),就可以实现模板 B 需要的功能。其中 f1() 单独使用即可,而 f2() 和 f3() 需要组合起来使用,如下所示:

class B{private:A * a;
public:void g1(){a->f1();}void g2(){a->f2();a->f3();}
};

可以看到,就如同是电源适配器将不适用的交流电变得适用一样,

模板 B 将不适合直接拿来用的模板 A 变得适用了,因此我们可以将模板 B 称为 B 适配器。

容器适配器的底层实现和模板 A、B 的关系是完全相同的。

2.2 容器适配器的本质

容器适配器本质上还是容器,只不过此容器模板类的实现,利用了大量其它基础容器模板类中已经写好的成员函数。当然,如果必要的话,容器适配器中也可以自创新的成员函数。

注意, STL 中的容器适配器, 其内部使用的基础容器并不是固定的, 用户可以在满足特定条件的多个基础容器中根据需求 选择;

3. 容器适配器的分类

  1. stack 栈适配器
  2. queue 队列适配器;
  3. priority_queue 优先权队列适配器;

各个容器适配器,所使用的默认基础容器, 以及可以供用户选择的基础容器, 如表所示

表 1 STL 容器适配器及其基础容器

容器适配器 基础容器筛选条件 默认使用的基础容器
stack 基础容器需包含以下成员函数: empty() , size() ,back(), push_back(), pop_back()满足条件的基础容器有 vector、deque、list。 deque
queue 基础容器需包含以下成员函数:empty(),size(),front(),back() ,push_back(), pop_front()满足条件的基础容器有 deque、list。 deque
priority_queue 基础容器需包含以下成员函数:empty(),size(),front(),push_back(),pop_back(), 满足条件的基础容器有vector、deque。 vector

不同场景下, 不同的序列式容器其底层采用的数据结构不同
因此,容器适配器的执行效率也不尽相同;

4. 小结

由以上知识点,

  1. C++中stack 是容器么?
  2. 我们使用的stack是属于哪个版本的STL?
  3. 我们使用的STL中stack是如何实现的?
  4. stack 提供迭代器来遍历stack空间么?

4.1 stack 是容器适配器

stack 是容器适配器,虽然本质上是容器,但其机理是调用底层的基础容器, 进行改动然后封装成特定功能的容器;

4.2 stack 属于哪个版本的STL?

通常情况下,我们使用的是 SGI STL 数据结构中的 stack ;

三个最为普遍的STL版本:

  • HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。

  • P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的。

  • SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高。

接下来介绍的栈和队列也是SGI STL里面的数据结构, 知道了使用版本,才知道对应的底层实现。

4.3 我们使用的STL中stack是如何实现的?

栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器可以 是vector,deque,list ,也就是说我们可以控制使用哪种容器来实现栈的功能。

所以STL中栈被归类为container adapter(容器适配器)。

而 vector, deque, list 的底层实现可以是 数组 或链表;

我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的低层结构。

deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。

  • 通过指定底层容器 实现 stack 和 queue;
SGI STL中 队列底层实现缺省情况下一样使用deque实现的。我们也可以指定vector为栈的底层实现,初始化语句如下:std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈刚刚讲过栈的特性,对应的队列的情况是一样的。队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器, SGI STL中队列一样是以deque为缺省情况下的底部结构。也可以指定list 为起底层实现,初始化queue的语句如下:std::queue<int, std::list<int>> third;// 定义以list为底层容器的队列

4.4 栈不提供 走访功能 和 迭代器

栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)

不像是set 或者map 提供迭代器iterator来遍历所有元素。

5.1 c++ STL 容器适配器简介相关推荐

  1. C++ 标准模板库 STL 容器适配器

    C++ 标准模板库 STL 容器适配器 容器 数据结构 时间复杂度 顺序性 重复性 stack deque / list 顶部插入.顶部删除 O(1) 无序 可重复 queue deque / lis ...

  2. STL 容器简介:C++ 容器:顺序性容器、关联式容器和容器适配器

    STL标准容器类简介 标准容器类 说明 顺序性容器 vector 从后面快速的插入与删除,直接访问任何元素 deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,从任何地方快速 ...

  3. C++ STL : 模拟实现STL中的容器适配器priority_queue

    目录 priority_queue 文档介绍 实现思路 思路 仿函数 实现 priority_queue 文档介绍 文档介绍 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含 ...

  4. C++ STL : 模拟实现STL中的容器适配器stack和queue

    目录 什么是容器适配器 stack stack的文档介绍-(来自cplusplus) stack的实现 queue queue的文档介绍-(来自cplusplus) queue的实现 什么是容器适配器 ...

  5. C++STL总结笔记(一)—— 容器和容器适配器

    文章目录 前言 一.概念 1.1 顺序容器 1.2 容器适配器 1.3 关联容器 二.程序示例 1. vector和Set自定义数据类型的访问 2.vector容器嵌套 3.list容器排序 4.pa ...

  6. (P85)stl(十三):容器适配器,stack,queue,优先级队列priority_queue,make_heap

    文章目录 1.容器适配器 2.stack 3.queue 4.优先级队列priority_queue 5.make_heap 6.set 1.容器适配器 利用基本容器构造的容器,称之为容器适配器 基本 ...

  7. c++STL容器的priority_queue

    TL容器的priority_queue STL容器的priority_queue的简介 STL容器的priority_queue的简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL ...

  8. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  9. c++ STL容器初探

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

最新文章

  1. Reallusion Character Creator 3中文版
  2. tkinter 笔记:列表部件 listbox (莫烦python 笔记)
  3. boost::is_convertible相关的测试程序
  4. python知识点智能问答_基于知识图谱的智能问答机器人
  5. java 数值变量_Java 中数值变量赋值问题
  6. 在ODBC中应用DDX和RFX
  7. VS2010 php 插件配置
  8. STM32工作笔记0016---MDK开发环境安装
  9. 计算机桌面底部不显示了,为什么电脑底部不会显示出来怎么办
  10. Live2D Cubism Editor Pro v4.1.00 卡通动画模型制作工具中文版
  11. 小京东商城用什么版本的php,小京东2018多用户通用商城网源码商城带手机版ecshop源码程序...
  12. Linux内核编程(1)
  13. 《第一行代码》(第二版)广播的问题及其解决
  14. Linux-发送邮件
  15. idea gradle GC overhead limit exceeded
  16. CVE-2022-28512 Fantastic Blog CMS 存在SQL注入漏洞
  17. QCustomPlot使用心得三:线样式,点样式
  18. java 耦合解耦_程序的耦合和解耦
  19. 有哪些高含金量的编程竞赛?
  20. AlphaStar: Mastering the Real-Time Strategy Game StarCraft II 博客阅读

热门文章

  1. 天道酬勤系列之Redis 事务的介绍与实例使用
  2. java学习第12天
  3. 前端学习之认识HTML
  4. 日语学习资料下载 N5—N1都有
  5. 比win7运行快的linux发行版,旧电脑扔了浪费!装SliTaz系统,瞬间运行流畅如新机,比win7更快...
  6. 华为2015年实习招聘机试
  7. 一分钟实现生成自定义的连续时间格式字符
  8. Linux中的nl命令
  9. 专访仙工智能叶杨笙:工业产品如何提升研发效能?
  10. 电脑硬件:蓝屏的常见解决方案