当前位置: 首页 > news >正文

stack,queue以及deque的介绍

1.stack与queue的实现

  1. 栈和队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类
  2. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少
    支持以下操作:
    empty:检测队列是否为空
    size:返回队列中有效元素的个数
    front:返回队头元素的引用
    back:返回队尾元素的引用
    push_back:在队列尾部入队列
    pop_front:在队列头部出队列
  3. 标准容器类deque,list和vector满足了这些要求。默认情况下,如果没有为queue实例化指定容器
    类,则使用标准容器deque。
#include<iostream>
#include<vector>
#include<list>
#include<deque>
using namespace std;
namespace LL
{    //适配器template<class T, class Container = deque<T>>//默认为dequeclass stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}bool empty(){return _con.empty();}size_t size(){return _con.size();}T& top(){return _con.back();}const T& top()const{return _con.back();}private:Container _con;};
}

queue的底层同理

2.那为什么要用deque为默认呢

我们先来看一下vector与list的优缺点
在这里插入图片描述
而deque就像是他们的结合,既可以满足头插头删的效率也可以利用下表随机访问
我们来通过他的底层来分析他是如何实现的:
在这里插入图片描述
在这里插入图片描述
这就是他的底层结构,利用中控数组来控制其中的小数组,将小数组的地址存放在中控数组中。一个小数组满了之后就去下一个小数组中。
下面我们来分析一下他的源码进行理解:

在这里插入图片描述
这是他的迭代器结构cur是小数组的遍历指针,first与last是小数组的头尾位置,node是小数组在中控数组中的位置。
有start和finish分别指向中控数组的头尾
在这里插入图片描述
尾插很简单先判断小数组是否还有空位,如果有就直接尾插但如果小数组已满,先判断中控数组是否需要扩容(即便扩容效率也很高因为中控数组中存储的是小数组的地址不需要像vector那样将数据一个一个拷贝)
而头插还需要注意一点头插需要将数据从小数组的尾部开始从前插入,这样才能正常遍历,如果从头部开始那么迭代器++后数据是空的。

在这里插入图片描述
接下来我们来看下标访问是怎么实现的
已知下标n,因为每个小数组大小相同,所以用简单的/与%就可以算出在那个小数组的第几个。但真的是这样实现的吗
来看源码

在这里插入图片描述
在operator+=中的n+(cur - first)是因为头插时数据是从后开始插入的所以不能直接用n来计算,用cur与first来补上头插的空数据。
在这里插入图片描述
补充一点:一开始的小数组并不是从中控数组开头插入而是在中控数组的中间这样不会一开始头插和尾插就要扩容

http://www.xdnf.cn/news/1355041.html

相关文章:

  • 深度学习中主流激活函数的数学原理与PyTorch实现综述
  • 【字母异位分组】
  • 随机森林1
  • 【机器学习深度学习】多模态学习
  • 【GaussDB】使用MySQL客户端连接到GaussDB的M-Compatibility数据库
  • 【85页PPT】数字化转型LIMS大型企业智能制造之LIMS实验室管理系统产品解决方案(附下载方式)
  • MVC模式在个人博客系统中的应用
  • 简单介绍计算机的工作过程
  • 激光雷达工作原理
  • 算法训练营day59 图论⑨ dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
  • C++初阶(2)C++入门基础1
  • 第1篇:走进日志框架的世界 - 从HelloWorld到企业级应用
  • 为什么在WHERE子句里使用函数,会让索引失效
  • 复杂工业场景误报率↓85%!陌讯多模态火焰识别算法实战解析
  • Codeforces Round 1043 (Div. 3)(A-E)
  • 历史数据分析——半导体
  • 【科研绘图系列】浮游植物的溶解性有机碳与初级生产力的关系
  • 【Game】Powerful——Punch and Kick(12.2)
  • ComfyUI Portrait Master肖像大师中文版
  • 【51单片机】【protues仿真】基于51单片机宠物投食器系统
  • Redis 持久化策略
  • 如何创建自己的 Minecraft 世界
  • MiMo-VL 技术报告
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(九)数值拖拽控件、进度条、滑动条
  • 【51单片机】【protues仿真】 基于51单片机储物箱系统
  • 双指针:三数之和
  • Sentinel相关记录
  • OSI参考模型TCP/IP模型 二三事
  • docker的基础配置
  • redis----hash类型详解