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

news2024/11/25 19:43:40

欢迎来到博主的专栏: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的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【html】学会这一套布局,让你的网页更加

很多小伙伴们在刚刚开始学习网页设计的时候不知道怎么布局今天给大家介绍一种非常实用且更加专业的一种布局。 灵感来源&#xff1a; 小米官网 布局图; 实例效果图&#xff1a; 这是一个简单的HTML模板&#xff0c;包括头部、内容区域和底部。 头部部分包括一个分为左右两部分…

TCP与UDP案例

udp不会做拆分整合什么的 多大就是多大

基数和基数转换

目录 一、定义&#xff1a; 二、各个进制&#xff1a; 1、二进制&#xff1a; 2、八进制&#xff1a; 3、十进制&#xff1a; 4、十六进制&#xff1a; 三、基数转换&#xff1a; 1、各类基数转十进制&#xff1a; 二转十&#xff1a; 八转十&#xff1a; 十六转八&a…

搭建自己的AI模型应用网站:JavaScript + Flask-Python + ONNX

1. 前言 本文作者以一个前端新手视角&#xff0c;部署自己的神经网络模型作为后端&#xff0c;搭建自己的网站实现应用的实战经历。目前实现的网页应用有&#xff1a; AI 语音服务主页AI 语音识别AI 语音合成AI CP号码生成器 欢迎大家试用感受&#xff0c;本文将以博客基于G…

【数学竞赛】阿里巴巴全球数学竞赛(附2019-2024年试题+答案)

阿里巴巴全球数学竞赛对所有年龄、背景和职业的个人开放。迄今为止&#xff0c;最年长的参赛者超过80岁&#xff0c;最年轻的仅8岁。 2024年共计801名选手参加比赛&#xff0c;涟水这中专的姜萍获得了全球12名的出众成绩&#xff0c;港中大也抛出了橄榄枝。 初赛注重享受数学之…

深入理解 Java 中的 synchronized 代码块

目录 前言 一、synchronized的工作原理 二、使用synchronized代码块的场景 三、编写synchronized代码块的最佳实践 四、何时使用 synchronized 代码块&#xff1f; 同步&#xff1a; 不同步&#xff1a; 五、Demo讲解 1.使用synchronized代码块减小锁的粒度&#xff0c…

大众点评js逆向过程(未完)

1、这里mtgsig已经被拼到url中 2、进入后mtgsig已经计算完&#xff0c; ir he(this[b(4326)], !1), 就是加密函数 32 次 796 1143 ->508 -> 754 -> 1151 160 注意IC这个数组 控制流平坦化进行AST 解析 AST网址

【背包题】oj题库

目录 1282 - 简单背包问题 1780 - 采灵芝 1888 - 多重背包&#xff08;1&#xff09;​编辑 1891 - 开心的金明 2073 - 码头的集装箱 1905 - 混合背包 1282 - 简单背包问题 #include <bits/stdc.h> using namespace std; //二维数组:dp[i][j]max(dp[i-1][j],v[i]dp[…

利用485缓存器实现两主一丛RS485串行通信

作者:艺捷自动化&#xff0c;其旗下产品有艺捷自动化网站和易为二维码小程序&#xff08;微信&#xff09; 对于工控自动化领域的电气工程师来说&#xff0c;基于RS485的串行通讯是最常见的。绝大部分仪表都能支持这种通讯方式。RS485通讯&#xff0c;是一种异步半双工模式&…

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

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

【Linux内核】伙伴系统算法和slab分配器(1)

【Linux内核】伙伴系统算法和slab分配器&#xff08;1&#xff09; 目录 【Linux内核】伙伴系统算法和slab分配器&#xff08;1&#xff09;伙伴系统&#xff08;buddy&#xff09;算法伙伴系统算法基本原理内存申请内存回收 接口函数源码分析内存分配接口物理内存释放接口规范…

spring boot配置ssl证书,支持https访问

1. 阿里云官网下载证书,云控制台搜索ssl&#xff0c;点击进入。 2.点击免费证书&#xff0c;立即购买。 3. 点击创建证书&#xff0c;填写完证书申请后&#xff0c;等待证书签发。 4. 证书签发以后&#xff0c;点击下载证书&#xff0c;spring boot选tomcat服务器类型的。 5. …

FineReport简单介绍

一、介绍 官网 &#xff1a;FineReport产品简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 报表是以表格、图表的形式来动态展示数据&#xff0c;企业通过报表进行数据分析&#xff0c;进而用于辅助经营管理决策。 FineReport 是一款用于报表制作&#xff0c;分析和…

Mybatis-Plus多种批量插入方案对比

背景 六月某日上线了一个日报表任务&#xff0c;因是第一次上线&#xff0c;故需要为历史所有日期都初始化一次报表数据 在执行过程中发现新增特别的慢&#xff1a;插入十万条左右的数据&#xff0c;SQL执行耗费高达三分多钟 因很早就听闻过mybatis-plus的[伪]批量新增的问题&…

C++语法05 浮点型/实数类型

什么是实数类型 实数类型是一种数据类型&#xff0c;实数类型变量里能存放小数和整数。 定义格式&#xff1a;double a; 赋值&#xff1a;a0.4; 输入&#xff1a;cin>>a; 输出&#xff1a;cout<<a; 训练&#xff1a;尺子的价格 小知在文具店买铅笔&#xff…

亲测几十款随身wifi,全网最全随身WiFi避坑指南!最值得买的随随身wifi品牌推荐!

关于随身wifi我认为我是比较有发言权的&#xff0c;历经三年测评了几十种随身wifi&#xff0c;便宜的贵的&#xff0c;大牌的小厂的&#xff0c;电池款USB款等各种随身wifi。根据测试结果以及通过电商平台搜索、粉丝反馈、社交平台评价等综合测评结果。今天就跟大家分享一下&am…

Orange_Pi_AIpro运行蜂鸟RISC-V仿真

Orange_Pi_AIpro运行蜂鸟RISC-V仿真 突发奇想&#xff0c;试一试Orange Pi AIpro上运行蜂鸟RISC-V的仿真。 准备 默认已经有一个Orange Pi AIpro&#xff0c;并且对设备进行一定的初始化配置&#xff0c;可以参考上一篇博文开源硬件初识——Orange Pi AIpro&#xff08;8T&a…

《C++ Primer》导学系列:第 2 章 - 变量和基本类型

2.1 基本内置类型 概述 本小节介绍C中的基本内置类型。基本内置类型是构成C程序的基础&#xff0c;它们用于表示数据的不同形式&#xff0c;如整数、浮点数、字符等。理解和使用这些基本类型是编写C程序的起点。 2.1.1 算术类型 C的算术类型分为整型和浮点型。整型用于表示…

LVS三种负载均衡模式:NAT、Tunneling和DR的技术对比

1. LVS-NAT 模式的特性 IP使用&#xff1a;RS&#xff08;Real Server&#xff09;应使用私有地址&#xff0c;RS的网关必须指向DIP&#xff08;Director IP&#xff09;。网络范围&#xff1a;DIP和RIP必须在同一个网段内。数据包处理&#xff1a;请求和响应报文都需要经过Di…

【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库&#xff0c;使用绑定参数获取数据时&#xff0c;出现报错 如果使用PDO_OCI接口连接数据库&#xff0c;未弹出异常&#xff0c;但是无法正确获取数据 【问题原因分析】 开启O…