c++编程(16)——STL(4)deque

欢迎来到博主的专栏:c++编程
博主ID:代码小豪


文章目录

    • deque
    • deque的优劣势
    • deque的操作
      • constructor
      • 元素访问

deque

deque的全称是double ended queue,译为双端队列,如何理解这个双端呢?我们以vector为例,vector插入元素和删除元素都是只改变后端的数据结构。
在这里插入图片描述
而deque可以在前端和后端进行数据的插入与删除(虽然vector也可以头删头插,但是前端是不会改变的,只有后端改变)。
在这里插入图片描述
其实这种数据结构在逻辑上和单链表非常类似,但是不同的是deque保存数据的并不是节点,而是像vector那样的顺序储存。总而言之,deque的底层的复杂程度高于vector和list,博主打算将deque的底层放在模拟实现上讲解。

deque的优劣势

如果我们想要一个线性表来管理数据,那么大多数人都会选择使用顺序表或者链表,如果想要数据的删除和插入效率高,就选择链表,如果想要随机访问数据,那么就选择顺序表,而deque做到了两个条件都具备,其数据的插入和删除效率高于vector,又可以随机访问数据。

那么deque这么强势,那么以后如果要创建一个线性表,是不是直接用deque就行了?当然不是,虽然deque集百家之长,但是并非全面优秀,其功能虽然多,但是效率未必最佳,我们来对比一下deque、list、vector在执行不同操作时的效率。

操作dequevectorlist
头插、尾插O(1)O(N)O(1)
插入和删除略高于vectorO(N)O(1)效率最好
随机访问效率低于vectorO(1)无法随机访问

可以发现、在deque的头部插入和删除的效率与list持平,因此deque也经常用于频繁进行头尾插入的场景当中,比如栈和队列就非常喜欢用deque作为容器。但是除此之外更多的选择则是list和vector。

deque的操作

vector、list、string、deque都属于线性表的数据结构,而线性表的数据的插入、删除操作的效果都是类似的,区别是在于底层的实现不同,但是博主在这里并不打算讲解deque的底层,因此跳过deque的数据修改操作。

constructor

default (1)	
explicit deque (const allocator_type& alloc = allocator_type());
fill (2)	
explicit deque (size_type n, const value_type& val = value_type(),
                const allocator_type& alloc = allocator_type());
range (3)	
template <class InputIterator>
  deque (InputIterator first, InputIterator last,
         const allocator_type& alloc = allocator_type());
copy (4)	
deque (const deque& x);

defalut构造
构造一个空的deque容器,没有任何元素。

deque<int> dq1;//空的deque容器
dq1.push_back(1);
dq1.push_back(2);
dq1.push_back(3);
dq1.push_back(4);

for (auto& e : dq1)
{
	cout << e << ' ';//1 2 3 4
}

填充(fill)构造
向deque容器填充n个值为val的元素

deque<int> dq2(5, 10);
for (auto& e : dq2)
{
	cout << e << ' ';//10 10 10 10 10
}
cout << endl;

范围(range)构造
向deque传入迭代器区间,将迭代器区间的元素按照顺序拷贝到deque当中

string str1("hello world");
deque<char> dq3(str1.begin(), str1.end());
for (auto& e : dq3)
{
	cout << e ;//hello world
}

将str1中的开头和结尾的迭代器传入deque容器当中,容器会根据传入的迭代器[begin(),end())区间内的所有元素拷贝到容器当中,反向迭代区间也是同理。

拷贝(copy)构造
将相同类型的deque容器拷贝到一个新容器当中,元素的顺序保持一致。

deque<char>dq4(dq3);//拷贝容器dq3
for (auto& e : dq4)
{
	cout << e;//hello world
}

c++11标准还引入了初始化列表构造。deque容器会按照顺序拷贝初始化列表({})中的元素。

deque<int> dq5{1, 2, 3, 4, 5, 6, 7, 8, 9};
for (auto& e : dq5)
{
	cout << e << ' ';//1,2,3,4,5,6,7,8,9
}

元素访问

deque支持随机访问,因此可以向vector一样使用下标访问deque元素。

deque<int> dq5{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < dq5.size(); i++)
{
	cout << dq5[i];//1,2,3,4,5,6,7,8,9
}

虽然deque和vector都支持随机访问容器元素,但是这并不意味着这两个容器的效率相同。我们可以用sort()算法来检验。

sort()算法是定义在<algorith>库中的函数,这个库是STL的算法库,支持对STL容器进行一些操作。sort()函数是将vector和deque进行排序操作,这就意味着会进行大量的下标访问操作(排序算法大多都会有下标访问操作)。

void TestAccessSpeed()
{
	srand((unsigned int)time(nullptr));//定义在stdlib.h的文件

	vector<int> v1;
	deque<int> d1;
	int i = 0;
	int num = 0;

	while (i < 100000)//向vector和deque当中插入100000个相同的数据
	{
		num = rand();//定义在stdlib.h的文件
		v1.push_back(num);
		d1.push_back(num);
		i++;
	}

	int begin1 = clock();//begin1是开始排序的时间
	sort(v1.begin(), v1.end());//vector开始排序
	int end1 = clock();//end1是结束排序的时间

	int begin2 = clock();
	sort(d1.begin(), d1.end());
	int end2 = clock();

	cout << "vector排序的时间:" << end1 - begin1 << endl;
	cout << "deque排序的时间:" << end2 - begin2 << endl;
}

经过测试,vector的排序时间比deque快上几倍。这说明了deque下标访问的效率其实是低于vector的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析人才管理的关键要素:“选、用、育、留”四大核心要素

在当今这个日新月异的商业时代&#xff0c;企业的成功不再仅仅取决于资金、技术或市场策略&#xff0c;而更多地依赖于企业所拥有的人才资源。有效的人才管理策略&#xff0c;尤其是“选、用、育、留”四大核心要素&#xff0c;已成为推动企业持续发展的关键。 一、选&#xff…

Canvas绘制老友记时钟

Canvas绘制老友记时钟 前言 一直做3D/2D可视化&#xff0c;Canvas API和三角函数&#xff0c;空间几何是基础。在官网上看了一遍Canvas API之后&#xff0c;决定绘制一个老友记时钟来巩固知识点&#xff0c;本文用实际代码讲解绘制过程。 代码 HTML <canvas id"myC…

electron模板【lectron-react-boilerplate】多窗口配置【HtmlWebpackPlugin】多页面配置

如果您正在使用electron-react-boilerplate进行快速的Electron应用程序开发,您可能会遇到想要在桌面应用程序中拥有多个原生窗口的情况。 MacOS窗口图像由OpenClipart-Vectors提供,来源Pixabay。 开始之前需要提及的事情! Electron有一个主进程和渲染进程的模式。可以有多个…

【MySQL】聊聊数据库是如何保证数据不丢的

对于一个存储系统来说&#xff0c;其中比较关键的核心组件包含&#xff0c;网络、存储模型、持久化、数据结构等。而数据如何保证不丢失&#xff0c;对于不同的存储系统来说&#xff0c;比如Redis采用AOF和RDB的方式进行混合使用&#xff0c;而MySQL采用日志进行保证。也就是re…

【C++11】第一部分(一万六千多字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 C11简介 统一的列表初始化 &#xff5b;&#xff5d;初始化 std::initializer_list 声明 auto decltype 右值引用和移动语义 左值引用和右值引用 左值引…

车票信息的请求与显示

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 发送与分析车票信息的查询请求 得到了获取车票信息的网络请求地址&#xff0c;然后又分析出请求地址的必要参数以及车站名称转换的文件&#xff…

利用鱼骨图进行项目问题复盘与改进

一、引言 在项目管理中&#xff0c;问题复盘是一个至关重要的环节。它不仅能帮助我们识别项目执行过程中出现的问题&#xff0c;还能促使我们深入探究问题的根本原因&#xff0c;从而采取有效的改进措施。在这个过程中&#xff0c;鱼骨图作为一种强大的工具&#xff0c;为我们…

GiantPandaCV | 提升分类模型acc(三):优化调参

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;提升分类模型acc(三)&#xff1a;优化调参 一、前言 这是本系列的第三篇文章&#xff0c;前两篇GiantPandaCV | 提升分类模型acc(一)&#xff1a;B…

一文讲通:前后端分离的四种开发模式,及其优缺点。

前后端分离已经成为了开发的主流模式&#xff0c;很多老铁认为前后端分离就是各干各的&#xff0c;其实不然。 前后端分离有多种模式&#xff0c;贝格前端工场为大家一一详解。 1. 前后端完全分离 在这种模式下&#xff0c;前端和后端是完全独立的两个系统。前端使用一种框架…

Python学习笔记9:入门知识(九)

缩进 什么是缩进&#xff1f; 缩进&#xff0c;简单的理解为本行的首字符相比上一行的首字符位置相对靠后。目前笔者接触的编程语言缩进一般是4字符&#xff0c;直接可以按tab键就行。 为什么突然讲缩进&#xff1f; Python这门语言&#xff0c;是依靠缩进来判断当前行与上…

十五边形有多少条对角线?(解答某位网友的困惑)

想要做出这种题目&#xff0c;必须得先列举一些多边形的例子。 三角形&#xff1a;000 四边形&#xff1a;112 五边形&#xff1a; 六边形&#xff1a; 此时即可发现规律&#xff1a; 三角形的对角线为(3-3)(3-3)0 四边形为&#xff1a;(4-3)(4-3)2 五边形为&#xff1a;…

增强的依赖性

增强的依赖性 原文参见 https://universaldependencies.org/u/overview/syntax.html 受控/提升主语 受控主语&#xff1a;表示主语由控制动词决定。提升主语&#xff1a;表示主语通过提升动词从嵌套句提升到主句。 基本树缺少受控动词与其控制者之间的主语依存关系&#xf…

民生银行信用卡中心金融科技24届春招面经

本文介绍2024届春招中&#xff0c;中国民生银行下属信用卡中心的金融科技&#xff08;系统研发方向&#xff09; 岗位2场面试的基本情况、提问问题等。 2024年04月投递了中国民生银行下属信用卡中心的金融科技&#xff08;系统研发方向&#xff09; 岗位&#xff0c;暂时不清楚…

8个宝藏APP,个个都牛逼哈拉!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 目前win7已经逐渐淡出人们的视野&#xff0c;大部分人都开始使用win10&#xff0c;在日常工作和使用中&#xff0c;创客们下载神奇的软件能大幅提…

最新下载:Folx【软件附加安装教程】

​Folx Pro是一款适合Mac的专业下载工具也是一款BT下载器&#xff0c;Folx中文版有一个支持Retina显示的现代界面&#xff0c;提供独特的系统排序、存储下载内容与预览下载文件&#xff0c;Folx中文官网提供Folx教程、激活码、下载。 Folx友好兼容浏览器&#xff1a;如果你在网…

Ubuntu 18.04下普通用户的一次提权过程

Ubuntu 18.04下普通用户的一次提权过程 一.背景介绍:二.主要调试过程:三.相关命令:1.设置BMC密码,获取BMC IP2.找一台ubuntu搭建TFTP服务,用来替换grub.cfg文件3.从调试服务器的/boot/grub/grub.cfg中提取出recovery mode的配置,简化并生成新的配置文件grub.cfg,放在tftp服务的…

Python教程:超详细1小时学会Python,太简单了!

1.Hello world 安装完Python之后&#xff0c;打开IDLE(Python GUI) &#xff0c;该程序是Python语言解释器,你写的语句能够立即运行。 我们写下一句著名的程序语句&#xff1a; 并按回车&#xff0c;你就能看到这句被K&R引入到程序世界的名言。 在解释器中选择"File…

永磁同步直线电机(PMLSM)控制与仿真2-永磁同步直线电机数学模型搭建

文章目录 1、公式总结2、电压方程模型3、运动方程4、推力方程5、转化关系 写在前面&#xff1a;原本为一篇文章写完了永磁同步直线电机数学模型介绍&#xff0c;永磁同步直线电机数学模型搭建&#xff0c;以及永磁同步直线电机三环参数整定及三环仿真模型搭建&#xff0c;但因为…

一文介绍暗区突围手游 游戏特色、具体玩法和独特的玩法体验

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 《暗区突围》是一款由腾讯魔方工作室群开发的第一人称射击游戏&#xff0c;于 2022 年 7 月 13 日正式公测&#xff0c;支持 Android 和 iOS 平台。这款游戏以从虚构的暗区收集物资并安全撤离作为最终目…

CrossOver和PD虚拟机谁更强大?CrossOver和PD虚拟机应该怎么选择

在当前的虚拟化技术和应用程序兼容性解决方案中&#xff0c;CrossOver和PD虚拟机&#xff08;Parallels Desktop&#xff09;都是备受用户喜爱的选择。对于需要在非原生系统上运行应用程序的用户而言&#xff0c;选择合适的工具尤为重要。那么&#xff0c;CrossOver和PD虚拟机谁…