【C++】STL——stack和queue的模拟实现、空间适配器、deque的介绍、增删查改函数的简单实现

文章目录

  • 1.deque的简单介绍
  • 2.模拟实现stack
  • 3.模拟实现queue

1.deque的简单介绍

deque的介绍文档

在这里插入图片描述

  deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。

在这里插入图片描述

deque的缺陷

  与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。

  与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。

  但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下, 而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构

为什么选择deque作为stack和queue的底层默认容器

  stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:

  1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。

  2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。

2.模拟实现stack

在这里插入图片描述

在这里插入图片描述

  这个stack类模板是一个栈的实现,使用了一个名为Container的模板参数来指定底层容器的类型,默认为deque。也就是说,如果不指定底层容器类型,那么stack类将使用deque作为底层容器

  push:将元素x插入到栈顶,实际上是调用底层容器的push_back函数。

  pop:弹出栈顶元素,实际上是调用底层容器的pop_back函数。

  top:返回栈顶元素的引用,实际上是返回底层容器的最后一个元素的引用。

  size:返回栈中元素的个数,实际上是返回底层容器的size函数的返回值。

  empty:判断栈是否为空,实际上是调用底层容器的empty函数。

  这个stack类模板的目的是提供一个封装了底层容器的栈的实现,使得我们可以方便地使用栈的各种操作。底层容器的选择可以根据我们具体的需求进行自定义或者使用默认的deque容器。

#pragma once
#include<vector>
#include<list>
#include<deque>namespace st
{//空间配置器template<class T, class Container = deque<T>>class stack{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}T& top(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};
}

3.模拟实现queue

在这里插入图片描述

  这个queue类模板是一个队列的实现,使用了一个名为Container的模板参数来指定底层容器的类型,默认为deque。也就是说,如果不指定底层容器类型,那么queue类将使用deque作为底层容器。

  push:将元素x插入到队列的末尾,实际上是调用底层容器的push_back函数。

  pop:弹出队列的第一个元素,实际上是调用底层容器的pop_front函数。

  front:返回队列的第一个元素的引用,实际上是返回底层容器的第一个元素的引用。

  back:返回队列的最后一个元素的引用,实际上是返回底层容器的最后一个元素的引用。

  size:返回队列中元素的个数,实际上是返回底层容器的size函数的返回值。

  empty:判断队列是否为空,实际上是调用底层容器的empty函数。

  这个queue类模板的目的是提供一个封装了底层容器的队列的实现,使得用户可以方便地使用队列的各种操作。底层容器的选择可以根据具体的需求进行自定义或者使用默认的deque容器。

#pragma once
#include<vector>
#include<list>
#include<deque>namespace que
{//空间配置器template<class T, class Container = deque<T>>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();//_con.erase(_con.begin());}T& front(){return _con.front();}T& back(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};
}

测试代码

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>
#include<stack>
#include<queue>
using namespace std;#include"stack.h"
#include"queue.h"void test_stack()
{//st::stack<int, std::vector<int>> st1;st::stack<int> st1;st1.push(1);st1.push(2);st1.push(3);st1.push(4);while (!st1.empty()){cout << st1.top() << " ";st1.pop();}cout << endl;st::stack<int, std::list<int>> st2;st2.push(1);st2.push(2);st2.push(3);st2.push(4);while (!st2.empty()){cout << st2.top() << " ";st2.pop();}cout << endl;
}void test_queue()
{//que::queue<int, vector<int>> q;que::queue<int> q1;q1.push(1);q1.push(2);q1.push(3);q1.push(4);while (!q1.empty()){cout << q1.front() << " ";q1.pop();}cout << endl;que::queue<int, list<int>> q2;q2.push(1);q2.push(2);q2.push(3);q2.push(4);while (!q2.empty()){cout << q2.front() << " ";q2.pop();}cout << endl;
}int main()
{test_stack();test_queue();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/52342.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15 springboot项目——thymeleaf语法与关闭模板引擎

15.1 thymeleaf语法 在html文件中&#xff0c;有些是需要使用本地的css样式&#xff0c;使用thymeleaf语法加载&#xff1a; 首先对head标签上面的html标签进行更改&#xff1a; <html lang"en" xmlns:th"http://www.thymeleaf.org"> 其次&#xff…

Ajax快速入门

文章目录 Ajax原生ajaxaxios案例 Ajax Ajax就是前端访问服务器端数据的一个技术 还有主要就是异步交互 就是在不刷新整页面的情况下&#xff0c;和服务器交换部分我也数据 比如搜索的联想技术 同步和异步的概念 一个是客户端需要等待服务器完成处理&#xff0c;才能进行别的事…

从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试是对系统…

解决 idea maven依赖引入失效,无法正常导入依赖问题

解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题_idea无法导入本地maven依赖_普通网友的博客-CSDN博客 解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题 idea是真的好用&#xff0c;不过里面的maven依赖问题有时候还真挺让人头疼&#xff0c;不少小…

Jenkins通过OpenSSH发布WinServer2016

上一篇文章> Jenkins集成SonarQube代码质量检测 一、实验环境 jenkins环境 jenkins入门与安装 容器为docker 主机IP系统版本jenkins10.10.10.10rhel7.5 二、OpenSSH安装 1、下载 官网地址&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/op…

数学建模-元胞自动机

clc clear n 300; % 定义表示森林的矩阵大小 Plight 5e-6; Pgrowth 1e-2; % 定义闪电和生长的概率 UL [n,1:n-1]; DR [2:n,1]; % 定义上左&#xff0c;下右邻居 vegzeros(n,n); % 初始化表示森林的矩阵 imh ima…

Python实现(条形码,二维码)生成识别

Python实现&#xff08;二维码&#xff0c;条形码&#xff09;生成识别 生成条形码生成二维码识别条形码二维码 生成条形码 安装barcode模块: $ pip install python-barcode barcode文档 import barcode from barcode.writer import ImageWriter # 更多了解&#xff1a;https…

多模块Springboot项目maven单独打包子模块

背景介绍 最近接手一个项目代号XXL&#xff0c;是一个多模块的Springboot项目&#xff0c;在解决了线上的bug之后&#xff0c;想单独给子模块打包上线部署&#xff0c;问题来了。如果整个工程一起mvn -X -DskipTests clean package&#xff0c;打包出来的XXL-web.jar是可以正常…

【2023 华数杯全国大学生数学建模竞赛】 A题 隔热材料的结构优化控制研究 问题分析、模型建立及参考文献

【2023 华数杯全国大学生数学建模竞赛】 A题 隔热材料的结构优化控制研究 问题分析、模型建立和参考文献 1 题目 A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性&#xff0c;在航天、军工、石化、建筑、交通等高科技领域中有着广泛的应用。 目前&#…

Centos7 上安装 redis-dump 和redis-load 命令

一、安装rvm 1、安装GPG keys gpg2 --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBcurl -sSL http://rvm.io/mpapis.asc | gpg2 --import - curl -sSL http://rvm.io/pkuczynski.asc | g…

html页面input设置日期和时分秒组件方法

html <input class"form-control" type"datetime-local" step"01">效果图

从web漏洞到linux权限提升

从web漏洞到linux权限提升 一、Linux系统介绍与使用二、Linux权限说明2.1、文件权限2.2、linux文件、目录权限说明 三、权限提升 一、Linux系统介绍与使用 linux-全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;是基于POSIXI的多用户、多任务…