C++STL——deque容器详解

在这里插入图片描述
纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。

💬文章目录

    • 一.deque容器的基本概念
    • 二.deque容器常用操作
      • ①deque构造函数
      • ②deque元素操作
      • ③deque赋值操作
      • ④deque交换操作
      • ⑤deque大小操作
      • ⑥deque插入和删除

一.deque容器的基本概念

vector容器是单向开口的连续内存空间,deque(['dek])则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,可以理解为数据结构的双端队列。当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,全部元素都要后移,无法被接受。
在这里插入图片描述
✅deque容器和vector容器的差异:

  • ①deque是双端队列,可在容器的头部和尾部插入或删除元素。
  • ②deque没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,deque不会像vector那样,”旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque身上是不会发生的。deque可以随时将空间串接在首部或尾部,也因此,deque没有必须要提供所谓的空间保留(reserve)功能。

✅deque容器内部实现原理:

deque容器在逻辑上是一片连续的空间,但这只是一种假象,实际deque是由一段一段的定量的连续空间构成。一旦有必要在deque前端或者尾端增加新的空间,便配置一段连续定量的空间,串接在deque的头端或者尾端。deque最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随机存取的接口,避开了(1)重新配置空间申请更大空间 (2)原数据复制新空间 (3)释放原空间三步骤,代价就是复杂的迭代器架构。

既然deque是分段连续内存空间,那么就必须有中央控制,维持整体连续的假象。deque内部存在中央控制器,记录与维护每段数据缓冲区(存储数据的空间)的内存地址,缓冲区中存储真实数据,保证可从容器的头部与尾部插入或删除元素。缓冲区才是deque的存储空间主体。
在这里插入图片描述
deque容器的迭代器:
支持随机访问的迭代器,可跳跃式访问容器元素。

二.deque容器常用操作

①deque构造函数

作用:创建deque容器。
注:使用deque容器时,需包含头文件#include <deque>

函数原型解释
deque<T> deq T;默认构造形式(显示实例化)
deque(beg, end);构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);有参构造函数,使用n个elem元素进行初始化。
deque(const deque &deq);拷贝构造函数,使用已有deque对象初始化新的对象。

实例:deque构造函数

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> v1 = { 1,2,3 };//采用模板实现类实现(显示实例化),默认构造函数,deque<int> v2(6, 1);//构造函数将n个elem拷贝给本身。int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };deque<int> v3(arr, arr + sizeof(arr) / sizeof(arr[0]));//将v[begin(), end())区间中的元素拷贝给本身deque<int> v4(v1);//拷贝构造函数,拿另一个vector对象初始化本身printdeque(v1);printdeque(v2);printdeque(v3);printdeque(v4);
}
int main()
{test();return 0;
}

在这里插入图片描述

②deque元素操作

作用:通过重载赋值运算符operator[]和成员函数at(int index),对deque容器的单个元素进行读(作为右值)或写(作为左值)。

函数原型解释
T &operator[](size_t n);通过[]访问元素,如果越界,不抛异常,程序直接挂掉
T &at(size_t n);通过at方法获取下标为n的元素,如果n越界,抛出out_of_range异常
T *data();返回容器中动态数组的首地址。
const T *data() const;返回容器中动态数组的首地址。
T &front();返回第一个元素。
T &back();返回,最后一个元素。

③deque赋值操作

作用:通过重载赋值运算符operator=和成员函数assign(),对deque容器进行赋值。

函数原型解释
assign(beg, end);拷贝目标deque容器中[begin(), end())区间的元素,对当前deque容器赋值。
assign(n, elem);将n个elem拷贝赋值给本身。
deque&operator=(const deque &deq);重载等号操作符
swap(deq);将deq与本身的元素互换

实例:deque赋值操作

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> deq;//尾插法插入元素for (int i = 0; i < 5; i++) {deq.push_back(i);}//遍历printdeque(deq);	//0 1 2 3 4/* 1.重载运算符=赋值 */deque<int> d1;d1 = deq;printdeque(d1);	//0 1 2 3 4/* 2.assign()函数,区间拷贝 */deque<int> d2;d2.assign(deq.begin(), deq.end());printdeque(d2);	//0 1 2 3 4/* 3.assign()函数,n个elem元素赋值 */deque<int> d3;//5个整型元素6d3.assign(5, 6);printdeque(d3);	//6 6 6 6 6
}
int main()
{test();return 0;
}

在这里插入图片描述

④deque交换操作

💬表格一览:

函数原型解释
void swap(deque &deq);把当前容器与deq交换。

实例:deque交换操作

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> deq;//尾插法插入元素for (int i = 0; i < 5; i++) {deq.push_back(i);}//遍历printdeque(deq);	//0 1 2 3 4deque<int> d1;d1.swap(deq);//将deq与本身的元素互换printdeque(d1);
}
int main()
{test();return 0;
}

在这里插入图片描述

⑤deque大小操作

作用:操作deque容器的大小(即元素个数)。

函数原型解释
bool empty() const;判断容器是否为空。
size_t size() const;返回容器的实际大小(已使用的空间)。
resize(int num);重新指定容器的长度为num。若容器变长,则以默认值0填充新位置;若容器变短,则容器末尾超出新长度的元素被删除。
resize(int num, elem);重新指定容器的长度为num。若容器变长,则以指定值elem填充新位置;若容器变短,则容器末尾超出新长度的元素被删除。

实例:deque大小操作

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> deq;//尾插法插入元素for (int i = 0; i < 5; i++) {deq.push_back(i);}printdeque(deq);	//0 1 2 3 4//empty():判断容器是否为空cout << (deq.empty() ? "deq为空" : "deq不为空") << endl;	//deq不为空//size(); :获取容器的大小,即元素个数。cout << "deq的大小/元素个数:" << deq.size() << endl;	//5//resize(int num);:重新指定容器的长度为num//若容器变长,则以默认值0填充新位置;若容器变短,则容器末尾超出新长度的元素被删除。deq.resize(10);			//长度变大时,使用默认值0填充printdeque(deq);	//0 1 2 3 4 0 0 0 0 0deq.resize(3);			//长度变小时,容器末尾超出新长度的元素被删除printdeque(deq);	//0 1 2//resize(int num, elem); :重新指定容器的长度为num。//若容器变长,则以指定值elem填充新位置;若容器变短,则容器末尾超出新长度的元素被删除。deq.resize(8, 6);		//长度变大时,使用指定值6填充printdeque(deq);	//0 1 2 6 6 6 6 6}
int main()
{test();return 0;
}

在这里插入图片描述

注:deque容器不存在容量的概念,即不存在capacity()成员函数。可随时开辟缓冲区存储数据。

⑥deque插入和删除

💬表格一览:

函数原型解释
iterator insert(iterator pos, const T& ele);在指定位置插入一个元素ele 返回指向插入元素的迭代器。
iterator insert(const_iterator pos, int count,ele);迭代器指向位置pos插入count个元素ele.返回指向插入元素的迭代器。
void push_front(const T& ele);在容器头部插入一个数据
void push_back(const T& ele);尾部插入元素ele
void pop_front();删除容器第一个数据
void pop_back();删除最后一个元素
void clear();清空容器。
iterator erase(const_iterator start, const_iterator end);删除迭代器从start到end之间的元素,返回下一个有效的迭代器。
iterator erase(const_iterator pos);删除迭代器指向的元素,返回下一个有效的迭代器。

实例:deque插入和删除

#include <iostream>
using namespace std;
#include <deque>//包含头文件
void printdeque(const deque<int>& deq)//形参使用const,避免被修改
{	//const_iterator只读迭代器for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); ++it){cout << *it<<"|";}cout << endl;
}
void test()
{deque<int> v;for (int i = 0; i < 5; i++){v.push_back(i + 1);//尾部插入元素}printdeque(v);//1 2 3 4 5v.insert(v.begin() + 1, 2, 100);//在第二个元素插入2个100printdeque(v);//1 100 100 2 3 4 5v.pop_front();//头部删除一个元素v.pop_back();//尾部删除一个元素printdeque(v);//100 100 2 3 4cout << "-------------" << endl;v.erase(v.begin());//删除第一个元素printdeque(v);//100 2 3 4deque<int>::const_iterator it = v.erase(v.begin() + 1, v.end() - 1);//删除从第二个元素到倒数第二个元素,返回下一个有效迭代器printdeque(v);//100 4v.insert(it, 66);printdeque(v);//100 66 4v.clear();//清空容器
}
int main()
{test();return 0;
}

在这里插入图片描述

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

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

相关文章

vue3中axios的使用方法

在Vue 3中使用axios发送HTTP请求的方法与Vue 2中基本相同。首先&#xff0c;需要安装axios库&#xff1a; npm install axios然后&#xff0c;在Vue组件中引入axios&#xff1a; import axios from axios;接下来&#xff0c;可以在Vue组件的方法中使用axios发送HTTP请求。例如…

Linux 系统运维工具之 OpenLMI

一、前要 OpenLMI&#xff08;全称 Open Linux Management Infrastructure&#xff09;即开放式的 Linux 管理基础架构。OpenLMI 是一个开源项目&#xff0c;用于管理 Linux 系统管理的通用基础架构。它建立在现有工具基础上&#xff0c;充当抽象层&#xff0c;以便向系统管理…

英码深元“三位一体”AI场景化解决方案,助力多地化工园区快速实现智慧化转型!

我国是世界公认的化工大国&#xff0c;同时也是崛起中的化工强国。近年来多起重大爆炸事故暴露出我国化工园区安全问题突出&#xff0c;特别是在安全风险管控数字化转型、智能化升级方面存在明显短板和不足&#xff0c;尤其突出的痛点&#xff1a;化工园区的日常管理方式较为粗…

VBA_MF系列技术资料1-172

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

【数据结构】带头双向循环链表及其实现

目录 1.带头双向循环链表 2.带头双向循环链表实现 2.1初始化 2.2销毁 2.3头插 2.4链表打印 2.5头删数据 2.6尾插数据 2.7尾删数据 2.8链表判空 2.9查找一个数据 2.10在pos位置前插入数据 2.11删除pos位置 2.12求链表的长度 2.顺序表和链表的比较 1.带头双向循环…

【python爬虫】4.爬虫实操(菜品爬取)

文章目录 前言项目&#xff1a;解密吴氏私厨分析过程代码实现&#xff08;一&#xff09;获取与解析提取最小父级标签一组菜名、URL、食材写循环&#xff0c;存列表 代码实现&#xff08;二&#xff09;复习总结 前言 上一关&#xff0c;我们学习了用BeautifulSoup库解析数据和…

matlab的基本使用

matlab的基本使用&#xff0c;可以参考如下的教程&#xff1a;matlab教程 本文针对基本内容进行记录。 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&…

Python学习笔记:正则表达式、逻辑运算符、lamda、二叉树遍历规则、类的判断

1.正则表达式如何写&#xff1f; 序号实例说明1.匹配任何字符(除换行符以外)2\d等效于[0-9]&#xff0c;匹配数字3\D等效于[^0-9]&#xff0c;匹配非数字4\s等效于[\t\r\n\f]&#xff0c;匹配空格字符5\S等效于[^\t\r\n\f]&#xff0c;匹配非空格字符6\w等效于[A-Za-z0-9]&…

大数据Flink简介与架构剖析并搭建基础运行环境

文章目录 前言Flink 简介Flink 集群剖析Flink应用场景Flink基础运行环境搭建Docker安装docker-compose文件编写创建并运行容器访问Flink web界面 前言 前面我们分别介绍了大数据计算框架Hadoop与Spark,虽然他们有的有着良好的分布式文件系统和分布式计算引擎&#xff0c;有的有…

java基础-----第八篇

系列文章目录 文章目录 系列文章目录一、Java类加载器二、双亲委托模型 一、Java类加载器 JDK自带有三个类加载器&#xff1a;bootstrap ClassLoader、ExtClassLoader、AppClassLoader。 BootStrapClassLoader是ExtClassLoader的父类加载器&#xff0c;默认负责加载%JAVA_HOME…

自动驾驶攻城战,华为小鹏先亮剑

点击关注 文&#xff5c;刘俊宏 编&#xff5c;苏扬、王一粟 本文为光锥智能x腾讯科技联合出品 2023年过半&#xff0c;城市NOA&#xff08;城市领航辅助驾驶&#xff09;的元年如预期中到来了吗&#xff1f; 8月25日&#xff0c;成都车展开幕&#xff0c;与4个月之前的上海…

PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化实践技术应用

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

华为云云服务器评测|华为云云耀云服务器L实例使用教学

文章目录 教学小故事 教学 华为云云耀云服务器L实例是一款提供高效、可靠、安全的基础设施服务的云服务器。下面是使用教学&#xff1a; 登录华为云官网。 测评产品链接&#xff1a;https://www.huaweicloud.com/product/hecs-light.html 进入云耀云服务器管理控制台&#xf…

Qt 查找文件夹下指定类型的文件及删除特定文件

一 查找文件 bool MyXML::findFolderFileNames() {//指定文件夹名QDir dir("xml");if(!dir.exists()){qDebug()<<"folder does not exist!";return false;}//指定文件后缀名&#xff0c;可指定多种类型QStringList filter("*.xml");//指定…

算法竞赛备赛之数学知识训练提升,暑期集训营培训

1.质数 在大于1的整数&#xff0c;如果质包含1和本身这两个约数&#xff0c;就称之为素数/质数。 1.质数的判定&#xff08;试除法&#xff09; 优化后的&#xff1a; #include<iostream> #include<algorithm> ​ using namespace std; ​ bool is_prime(int n…

Python基础篇(17):模块与包

一、as 关键字的使用 1、as 关键字的作用&#xff1a;给导入的模块取别名 import 测试1 as Test_1 import 测试2 as Test_2Test_1.say_hello() Test_2.say_hello() 二、if __name__ __main__ 1、作用 测试当前模块所编写的代码块&#xff0c;根据业务自主选择需要运行的代…

二叉树的构建及遍历

目录 题目题目要求示例 解答方法一、实现思路时间复杂度和空间复杂度代码 方法二、实现思路时间复杂度和空间复杂度代码 题目 二叉树的构建及遍历 题目要求 题目链接 示例 解答 方法一、 先构建二叉树&#xff0c;再中序遍历。 实现思路 按照给出的字符串创建二叉树&am…

华为云云服务器评测|基于华为云云耀云服务器L实例开展性能评测,例如 MySQL、Clickhouse、Elasticsearch等等

在当今云计算时代&#xff0c;越来越多的企业和个人开始选择将应用部署在云服务器上&#xff0c;以便更好地满足高性能、可靠性和可扩展性等需求。而华为云云耀云服务器L实例不仅提供了高性能和可靠性的计算和存储资源&#xff0c;而且具有灵活和高效的成本控制&#xff0c;深受…

C语言基础之——结构体

前言&#xff1a;小伙伴们又见面啦&#xff0c;那么本篇文章&#xff0c;我们就将对C语言基础知识的最后一个章节——结构体展开讲解。 世上无难事&#xff0c;只要肯攀登&#xff01; 目录 一.什么是结构体 二.结构体讲解 1.结构体的声明和变量的定义 2.结构体成员的类型…

8. 损失函数与反向传播

8.1 损失函数 ① Loss损失函数一方面计算实际输出和目标之间的差距。 ② Loss损失函数另一方面为我们更新输出提供一定的依据。 8.2 L1loss损失函数 ① L1loss数学公式如下图所示&#xff0c;例子如下下图所示。 import torch from torch.nn import L1Loss inputs torch.tens…