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

【C++初阶】STL详解(七)Stack与Queue的模拟实现

本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:C++
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

STL详解(八)

  • 容器适配器
  • stack的模拟实现:
  • queue的模拟实现:

容器适配器

stack和queue有一点需要注意的是,虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque容器。

在stack和queue的类模板声明当中我们就可以看到,它们的模板参数有两个,第一个是stack和queue当中所存储的元素类型,而另一个就是指定使用的容器类型。只不过当我们不指定使用何种容器的情况下,stack和queue都默认使用deque作为指定容器。
在这里插入图片描述
理解: 学过数据结构后我们都知道,stack和queue既可以使用顺序表实现,也可以使用链表实现。
在这里我们若是定义一个stack,并指定使用vector容器,则定义出来的stack实际上就是对vector容器进行了包装

stack的模拟实现:

知道了容器适配器后,stack的模拟实现就显得相当简单,我们只需要调用所指定容器的各个成员函数即可实现stack的各个函数接口。
在这里插入图片描述
模拟实现代码如下:

namespace NIC //防止命名冲突
{template<class T, class Container = std::deque<T>>class stack{public://元素入栈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();}//交换两个栈中的数据void swap(stack<T, Container>& st){_con.swap(st._con);}private:Container _con;};
}

测试一下:
在这里插入图片描述

queue的模拟实现:

同样的方式,我们也是通过调用所指定容器的各个成员函数来实现queue的。
在这里插入图片描述
模拟实现代码如下:

namespace NICO //防止命名冲突
{template<class T, class Container = std::deque<T>>class queue{public://队尾入队列void push(const T& x){_con.push_back(x);}//队头出队列void pop(){_con.pop_front();}//获取队头元素T& front(){return _con.front();}const T& front() const{return _con.front();}//获取队尾元素T& back(){return _con.back();}const T& back() const{return _con.back();}//获取队列中有效元素个数size_t size() const{return _con.size();}//判断队列是否为空bool empty() const{return _con.empty();}//交换两个队列中的数据void swap(queue<T, Container>& q){_con.swap(q._con);}private:Container _con;};
}

测试一下:
在这里插入图片描述

http://www.lryc.cn/news/240568.html

相关文章:

  • 校园报修抢修小程序系统开发 物业小区报修预约上门维修工单系统
  • 【Android】Hilt比Android好在哪里
  • 计算方法 期末总结
  • 【面试】jvm中堆是分配对象存储的唯一选择吗
  • 音视频同步笔记 - 以音频时间为基
  • JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系
  • 报错For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
  • whisper使用方法
  • 通过easyexcel实现数据导入功能
  • Springboot_文件下载功能(前端后端)
  • Vue框架学习笔记——v-bind数据单向绑定和v-model数据双向绑定
  • 将对象转成URL参数
  • 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
  • 超级武器!深入LoadRunner性能测试流程及极速分析结果!
  • 解决requests库进行爬虫ip请求时遇到的错误的方法
  • 大语言模型领域的重要术语解释
  • 无需公网IP,使用内网穿透实现公网访问本地OpenWRT管理界面
  • 利用 docker 实现JMeter分布式压测
  • Sentinel 分布式系统
  • Cookie、Session、CBV加装饰器的三种方法
  • 【高级渗透篇】网络安全面试
  • 【Flink】Process Function
  • 【源码分析】zeebe actor模型源码解读
  • python3实现类似expect shell的交互式与SFTP的脚本
  • java游戏制作-飞翔的鸟游戏
  • NodeMCU ESP8266构建Web Server网页端控制设备
  • 搭建区块链
  • Python通过selenium调用IE11浏览器报错解决方法
  • Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂
  • opencv-图像金字塔