容器适配器

首先我们要知道容器适配器是干啥的。
我们可以简单的将容器适配器当做一个接口装置。有的电脑上没有数据转接口,但是有usb接口,这是我们没必要重新买一个电脑,我们可以做一个usb数据转接线。而这根数据转接线就类似于适配器一样。在C++中,我们已经有了(vector、list、deque等容器)插入、删除、迭代器就电脑usb接口,当我们想要实现栈的操作时,我么没有必要再重新写新的数据结构,只需要将其接口进行重新的封装,相当于做了一根数据转接线。我们就可以将这个容器当做数据结构使用。

C++中定义了3种容器适配器,它们让容器提供的接口变成了我们常用的的3种数据结构,stack(栈)、queue(队列)、priority_queue(优先级对列)

  • 栈:先进后出,我们可以想一下,在STL中,其底层应该一些序列式中容器,能够进行提供push_back(向栈顶插入元素) 、pop_back(删除栈顶元素)序列式容器都可以满足封装成栈的要求。
  • 队列:先进先出。对pop_front(头删)、push_back(尾插)操作的序列式容器的封装,底层不可能是vector。
  • 优先级队列:支持随机访问的功能,所以其底层结构只能为vector或duque。

stack(栈)接口

接口 接口说明
empty() 栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素

qeque(队列)接口

接口 接口说明
empty() 队列为空则返回真
front 队首元素地址
back 队尾元素地址
size() 返回队列中元素数目
push() 在队尾中插入元素
pop() 队首元素出队

priority_queue(优先级对列)

接口 接口说明
empty() 如果优先队列为空,则返回真
pop() 删除第一个元素
push() 加入一个元素
size() 返回优先队列中拥有的元素的个数
top() 返回优先队列中有最高优先级的元素

我们观察一下,各个适配器的底层实现结构。

stack底层实现结构为deque

queue底层实现结构为deque

priority_queue底层实现结构为vector


为什么stack与queue底层为deque,priority_queue底层为vector?

deque于vector的区别

  • 底层实现不同:为双端队列
deque vector
底层实现不同 双端队列 连续的空间
插入删除方式 头尾两端都可插入、删除 任意位置都可插入、删除
查找效率 支持随机访问,速度比较慢 支持随机访问,速度快
扩容机制 deque在扩容不需要进行元素的搬移 扩容时需要进行元素的搬移
迭代器 对原生态指针的封装 原生态指针的别名

列举了几个重要的信息:我们现在了解到为啥stack、queue、priority_queue底层实现不同。

  • stack、queue不需要进行元素遍历,但是元素入栈、入队容易发生扩容操作,所以使用deque。在stack中元素增长时,deque比vector的效率高;queue中的元素增长时,deque不仅效率高,而且内存使用率高。

  • priority_queue需要对元素进行遍历,vector迭代器的速度相对于duque来说比较快。

stack模拟实现
由于直接使用stack容易于系统封装的stack发生冲突,解决办法 1.命名空间 2.类名修改,这里我使用第二中办法。

template<class T,class S = deque<T>>
class Stack
{public:Stack() {}void push(const T& x){_s.push_back(x);}void pop(){_s.pop_front();}T& top() //这块需要注意,由于栈是先进后出,这块于deque的刚好相反{return _s.back();}size_t size(){return _s.size();}bool empty(){return _s.empty();}
private:S _s;
};

queue模拟实现

namespace bai
{template<class T, class D = deque<T>>class queue{public:queue(){}void push(const T& data){_d.push_back(data);}void pop(){_d.pop_front();}T& top(){return _d.front();}size_t size(){return _d.size();}bool empty(){return _d.empty();}T& back(){return _d.back();}private:D  _d;};
}

priority_queue模拟实现

//模板参数:参数类型,底层实现结构,比较方式,默认为大顶堆 less:大堆 greater:小堆
template<class T, class Container = vector<T>,class Compare = less<T>>
class priority_queue
{public:priority_queue():con(){}template<class iterator>priority_queue(iterator first, iterator last): con(first,last){int rear = con.size();int node = ((rear - 2) >> 1);for (; node >= 0; --node){AdjustDown(node);}}void push(const T& x){con.push_back(x);AdjustUp(con.size()-1);}void pop(){if (con.empty())return;swap(con.front(), con.back());con.pop_back();AdjustDown(0);}T& top(){return con.front();}bool empty(){return con.empty();}private:void AdjustUp(int child_index){int parent_index = (child_index - 1) >> 1;while (child_index != 0){if (comp(con[parent_index], con[child_index])){swap(con[parent_index], con[child_index]);child_index = parent_index;parent_index = (child_index - 1) >> 1;}elsereturn;}}void AdjustDown(int parent_index){int child_index = parent_index * 2 + 1;if (child_index < con.size() - 1 && comp(con[child_index], con[child_index+1])){child_index += 1;}if (comp(con[parent_index], con[child_index])){swap(con[parent_index], con[child_index]);parent_index = child_index;child_index = child_index * 2 + 1;}elsereturn;}Container con;Compare comp;
};

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. C++ 容器适配器(stack、queue、priority_queue)

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

  5. 模拟stack/queue/priority_queue

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

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

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

  7. C++ Stack Queue priority_queue

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

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

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

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

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

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

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

最新文章

  1. ReSIProcate源码目录下功能说明
  2. HTML5 本地数据库IndexedDB数据库
  3. 多线程创建方式 线程池、Future和CompletableFuture
  4. 聊聊hikari与tomcat jdbc pool的fail fast
  5. JSTL和EL的使用
  6. 多传感器数据标定融合完整教程:时间同步+空间同步(Camera+Lidar+IMU+Radar)
  7. codeforces 812B. Sagheer, the Hausmeister
  8. 视频追踪(meanshift和camshift算法)
  9. 齐次线性方程组系数矩阵的秩与解集的秩
  10. 玩转Kaggle:Dog Breed Identification【识别狗的类别】
  11. 防CC攻击 软件防火墙和WEB防火墙大比较
  12. vite + ts + eslint全局变量配置
  13. 1908: 【18NOIP提高组】填数游戏
  14. GIS基础制图之地形图
  15. docker容器创建的流程详解
  16. mybatis 日志 Reader entry 乱码
  17. 逻辑面试题:一个逻辑学教授,有三个学生,3个人玩猜数字的游戏
  18. Sharding-JDBC简单使用
  19. 视图实现圆角效果的三种方法及比较
  20. doxygen安装与使用

热门文章

  1. iOS 应用首次开启 出现引导页面
  2. 通过安装和配置AD域解决Windows Server 2016的IIS无法加载SMB文件卷文件的问题
  3. TypeScript 3.3发布:改进了联合类型调用和构建时间
  4. SpringCloud学习之SpringCloudStream集成kafka
  5. 52.puppet自动化运维工具
  6. VMware VSphere 引发的学案(三)
  7. windows + visual studio 2010 配置SVN
  8. 一步步Netty的基石 - Reactor模式
  9. mysql索引选择_MySQL 索引选择原则
  10. FreeRTOS源码分析与应用开发10:内存管理