容器适配器

首先,我们要明白适配器是干什么的?其实就是一个接口转换装置,是得我们能用特定的方法去操作一些我们本来无法操作的东西。举一个例子,比如你的一个设备支持串口线,而你的电脑支持的是usb口,这时候,我们没有必要重新买一个支持usb的设备,只需要一根串口转usb口的小玩意,让你的设备能够连接到usb插口上,而它就是适配器。

不同场景下,由于不同的序列式容器其底层采用的数据结构不同,因此容器适配器的执行效率也不尽相同。但通常情况下,使用默认的基础容器即可。当然,我们也可以手动修改,

如果有了解双端队列会更有利于学习容器适配器,我将双端队列单独用一篇博客简单讲解

stack

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作empty:判空操作; back:获取尾部元素操作; push_back:尾部插入元素操作; pop_back:尾部删除元素操作。标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器, 默认情况下使用deque。

stack的实现

stack可以通过 vector< T >、list< T >、deque< T >
默认使用deque< T >
原因:

  1. 与vector相比:stack不需要随机访问,也没有迭代器。而deque的增容代价小
  2. 与list相比:stack不需要在任意位置的插入和删除。而deque不容易造成内存碎片
template<class T, class Container = deque<T>>
class Stack
{public:Stack(){}void push(const T& x){con.push_back(x);}void pop(){con.pop_back();}T& top() {return con.back();} const T& top()const{return con.back();}size_t size()const{return con.size();}bool empty()const{return con.empty();}
private:Container con;
};

运行结果:

queue

队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空 ;size:返回队列中有效元素的个数; front:返回队头元素的引用 ;back:返回队尾元素的引用;push_back:在队列尾部入队列;pop_front:在队列头部出队列;标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque

queue的实现

queue可以通过 list< T >、deque< T >
默认使用deque< T >
原因:

  1. vector没有pop_front()接口
  2. 与list相比:queue不需要在任意位置的插入和删除。而deque不容易造成内存碎片
template<class T, class Container = deque<T>>
class Queue
{public:Queue() {} void push(const T& x) { con.push_back(x);} void pop() { con.pop_front();} T& back() { return con.back();}  const T& back()const{ return con.back();} T& front() { return con.front();} const T& front()const { return con.front();}size_t size()const { return con.size();} bool empty()const { return con.empty();}
private: Container con;
};

测试结果:

priority_queue

由于priority_queue实现比较复杂且熟悉读者不多,我就单独详细写了一篇关于priority_queue的使用及实现容器适配器priority_queue的使用及实现

C++ 容器适配器(stack、queue、priority_queue)相关推荐

  1. [C++](13)stack queue priority_queue 模拟实现:容器适配器,deque介绍,仿函数详解

    文章目录 使用 stack 栈 queue 队列 priority_queue 优先级队列 什么是容器适配器? deque 容器简单介绍 模拟实现 stack queue priority_queue ...

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

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

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

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

  4. 模拟stack/queue/priority_queue

    stack要点 1.stack遵从先进后出的规则,即先进栈的元素后出栈,入栈/出栈只能在栈的一端进行 2.stack是作为容器适配器被实现的,容器适配器是对特定类进行封装,作为其底层的容器 3.sta ...

  5. stl的set,multiset, map, multimap, deque, list, stack, queue, priority_queue

    set实际上是平衡二叉树,需要声明头文件#include<set> Insert:将元素插入集合中 使用前向迭代器对集合中序遍历 使用反向迭代器reverse_iterator可以反向遍历 ...

  6. C++ Stack Queue priority_queue

    栈stack:stack 后入先出(LIFO) q.top() 获取栈顶元素(并不删除) q.pop() 删除栈顶元素 q.push(x) 向栈中加入元素 q.empty() 判断栈是否为空 队列qu ...

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

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

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

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

  9. 第十一篇:(顺序)容器的好伴侣 --- 容器适配器

    前言 vector容器的数据结构原型是顺序表,它很好的实现了顺序表的功能,大大方便了编程.好了,现在假设有天我又想用栈,那么有没有栈对应的容器呢?很遗憾,木有.但基于"栈"可以由顺 ...

最新文章

  1. 鲜为人知的编程真相(转载)
  2. 【Coursera课程笔记】Web智能和大数据Week3_MapReduce
  3. Android编译笔记四
  4. linux的网络配置
  5. AGC023F - 01 on Tree
  6. mysql 备份脚本
  7. 【Java】Mybatis mapper动态代理方式
  8. 基于pytorch实现图像分类——理解自动求导、计算图、静态图、动态图、pytorch入门
  9. Java是先难后易吗_学软件应该“先难后易”还是“先易后难”?
  10. CPU指令集——AVX2
  11. printf输出格式化
  12. 双机互联攻略之超强、完全篇!
  13. 双纤网速叠加+GS105E实现单线三用+AC86+68组网Aimesh实现无线漫游
  14. 百度蜘蛛与百度快照的关系
  15. 微信小程序入门到实战(1)-基础知识
  16. 深入了解光耦,光耦如何连接进电路中?
  17. java使用es查询地理位置信息
  18. 基于python的数据分析系统,python数据分析经典案例
  19. 复旦大学科学计算机系王欢,复旦大学计算机科学技术学院举行2019级研究生新生入学教育大会...
  20. “gjw” is of a model that is not supported by this version of Xcode. Please use a different device.

热门文章

  1. html js布尔值怎么定义,JavaScript基本类型值-Undefined、Null、Boolean
  2. 基于matlab 的图像重建,基于Matlab的2D-FFT图像重建软件的设计
  3. rtsp连接断开_live555_RTSP连接建立以及请求消息处理过程
  4. div 位于屏幕正中间_折叠屏已经不新鲜了,明天你可能会用上“伸缩屏幕”!...
  5. isFinite使用说明
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的毕业论文设计管理系统
  7. php htm specialchars_decode,PHP htmlspecialchars和htmlspecialchars_decode(函数)
  8. c++ loadlibrary 初始化对象_C++构造函数和初始化表
  9. oracle表空间扩容方法
  10. java白皮书关键术语