容器适配器

标准库定义了三个顺序容器适配器:stack, queue和 priority_queue
适配器(adaptor)是标准库中的一个通用的概念。容器、迭代器和函数都有适配器。
一个适配器是一种机制,能使某种事物的行为看起来像另一种事物一样。
一个容器适配器接受一种已有的容器类型,并使其行为看起来像是一种不同的类型。例如:stack适配器接受一个顺序容器(除array或foreward_list外),并使其操作起来像一个stack一样。
所有容器适配器都支持的操作和类型
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和b的内容,a,b必须有相同类型,包括底层容器类型也必须相同
a.swap(a) 交换a和b的内容,a,b必须有相同类型,包括底层容器类型也必须相同

1、定义一个适配器

每个适配器都定义了两个构造函数:默认构造函数创建一个空对象;接受一个容器的构造函数拷贝该容器来初始化适配器。
  • 如果deq是一个deque<int>,我们可以用deq来初始化一个新的stack。如:stack<int>  stk(deq);//从deq拷贝元素到stk
  • 默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的。
  • 我们可以在创建一个适配器的时候将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。如下:
 //在vector上实现的空栈stack<string, vector<string>> str_stk;//str_stk2在vector上实现,初始化时保存svec的拷贝stack<string, vector<string>> str_stk2(svec);

备注:

  • stack只要求push_back, pop_back, back操作,因此使用除array和forward_list之外的任何容器类型来构造stack。
  • queue适配器要求back,push_back,  front, push_front 操作,因此使用list或deque来构造,但不能基于vector构造
  • priority_queue除了front, push_back, 和pop_back操作之外,还要求随机访问能力,因此它可以构造于vector或deque之上,但是不能使用list构造

2、栈适配器

stack类型定义在stack头文件中。
栈操作
s.pop() 删除栈顶元素,但不返回该元素值
s.push(item)
s.emplace(args)
创建一个新元素压入栈顶,该元素通过拷贝或移动item而来,
或者由args构造
s.top() 返回栈顶元素,但不将元素弹出栈
   

备注:

  • 当调用emplace成员函数时,是将参数传递给元素类型的构造函数。emplace使用这些参数在容器管理的内存空间中直接构造元素。
  • 栈默认是基于deque实现,也可以在list或vector之上实现。
    stack<int> intStack;//空栈for(size_t ix = 0; ix != 10; ++ix)intStack.push(ix);//intStack保存0-9共十个数字while(!intStack.empty()){int value = intStack.top();//返回栈顶元素,但是并不弹出该值,栈的内容保持不变。intStack.pop();//弹出栈顶元素,但是不返回该值,仅仅是删除该值}

备注:

每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作。我们只能使用适配器操作,不能使用底层容器类型的操作。
例如:stack是基于deque实现的,但是stack只能使用push操作,而不能使用deque的push_back操作。

3、队列适配器

queue和priority_queue适配器定义在queue头文件中。
queue和priority_queue操作
q.pop() 返回queue的首元素或priority_queue的最高优先级的元素,但不删除此元素。
q.front() 返回首元素,但不删除此元素,只适用于queue
q.back() 返回尾元素,但不删除此元素,只适用于queue
q.top() 返回最高优先级元素,但不删除该元素,只适用于priority_queue
q.push(item)
q.emplace(args)
在queue末尾或priority_queue中适当的位置创建一个元素,其值为item,
或者由args构造
备注:
priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。
饭店按照客人预订时间而不是到来时间的早晚来为他们安排座位,就是一个优先队列的例子。
默认情况下,标准库在元素类型上使用<运算符来确定相对优先级。

学习C++——容器适配器相关推荐

  1. C++primer第九章 顺序容器 9.6 容器适配器

    9.6容器适配器 除了顺序容器外,标准库还定义了三个顺序容器适配器:stack.queue和priority_queue 适配器(adaptor)是标准库中的一个通用概念.容器.迭代器和函数<3 ...

  2. C++ 容器适配器(stack、queue、priority_queue)

    容器适配器 首先,我们要明白适配器是干什么的?其实就是一个接口转换装置,是得我们能用特定的方法去操作一些我们本来无法操作的东西.举一个例子,比如你的一个设备支持串口线,而你的电脑支持的是usb口,这时 ...

  3. C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)

    除了vector,list,deque等常用的容器,还有根据这些常用的容器进行改造来满足特殊要求的容器,这些特殊容器的行为和常用容器很相近,也称为容器适配器. 常用的容器适配器有三个,分别是stack ...

  4. 学习Docker容器时,错误bash: ping: command not found的解决方法

    问题描述: 学习Docker容器时,在容器内进行ping时出现错误,提示如下:bash: ping: command not found 解决方法: 直接安装即可,命令如下:apt-get insta ...

  5. C++ Primer 5th笔记(9)chapter9 顺序容器 vector 容器的自增长 容器适配器

    1. vector 容器的自增长:当插入元素当存储空间不足时,vector 必须重新分配存储空间(比如将新空间大小增加为当前大小的2倍) 管理容量的成员函数 操作 定义 c.shrink_to_fit ...

  6. C++的三种容器适配器

    1.对容器适配器的理解 C++提供了三种容器适配器(container adapter): stack,queue和priority_queue. stack和queue基于deque实现,prior ...

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

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

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

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

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

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

最新文章

  1. boolean searching, it is so important for searching your papers
  2. java模拟刷百度排名无效_整理用于模拟百度分享的errno错误代码
  3. plsql登录时显示无服务器,plsql登录提示ORA-12514:TNS:listener does not currently know of service…………...
  4. VTK:点定位器可视化用法实战
  5. php云和骑士哪家好,PHP云人才系统与骑士cms人才系统对比点评
  6. bic,orr——设置某些位为0或者1
  7. ASP.NET Core的身份认证框架IdentityServer4--入门【转】
  8. 易语言mysql线程池数量_线程池最佳线程数量到底要如何配置?
  9. centos6.7 搭建jenkins
  10. 【转】Linux內核驅動之GPIO子系統(一)GPIO的使用 _蝸牛
  11. Tricks(三十四)—— 判断某一属性列是数值型还是标称型
  12. 自动检测技术学习心得体会_公司参加中机建设首届BIM技术应用培训班人员顺利结业...
  13. mysql 介于两个日期函数_帮忙看一上这个mysql函数,用来返回两个日期之间的年数...
  14. 在Web中使用jsmpeg.js低时延播放RTSP视频流(海康、大华)方案 - vue-jsmpeg-player
  15. 有钱任性的农夫山泉,被迫踏上IPO?
  16. 网站建设制作需要多少钱呢?费用是多少?
  17. IOS 企业级苹果开发者账号申请流程
  18. 渗透测试-CTF_AWD专题篇
  19. 活性DNA羟化酶 Tet1 活性测定
  20. 齐二TK6916/20/26/32系列数控落地铣镗床简介2

热门文章

  1. SwiftUI中NavigationLink多层嵌套导航无法返回上一层的原因及解决
  2. Tyvj 1047 乘积最大
  3. Android切词工具——BreakIterator(2)
  4. 信息技术领域排名增速第一, 再登中国500强!陌陌做对了什么?
  5. Hyperledger Fabric链码修改与测试(一)
  6. 【Linux】远程下载 Google Drive 文件方法
  7. unity技术补全计划
  8. 笔记本电脑相关术语详解
  9. 分布式ID雪花算法-解析
  10. linux网络诊断工具mtr;speedtest网络测速脚本