浅谈C++|STL之deque篇

news2024/12/26 13:19:46

在这里插入图片描述

一.deque基本概念

功能:

  • 双端数组,可以对头端插入删除操作

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度回比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关

在这里插入图片描述

deque内部工作原理

deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据中控器维护的是每个缓冲区的地址,使得使用deque时像—片连续的内存空间

在这里插入图片描述

. deque容器的迭代器也是支持随机访问的
. deque可以看成链表+vector

二.deque的构造函数

在 C++ 中,std::deque是一种双端队列容器,可以在两端进行高效地插入和删除操作。std::deque 的构造函数有以下几种形式:

  1. 默认构造函数:

    std::deque<T> deque;
    

    创建一个空的双端队列。

  2. 带有大小参数的构造函数:

    std::deque<T> deque(size);
    

    创建一个包含 size 个元素的双端队列,各元素都是默认构造的。

  3. 带有大小和初始值参数的构造函数:

    std::deque<T> deque(size, value);
    

    创建一个包含 size 个元素的双端队列,各元素都被初始化为 value

  4. 区间构造函数:

    std::deque<T> deque(first, last);
    

    创建一个双端队列,其中包含了序列 [first, last) 中的所有元素。

  5. 拷贝构造函数:

    std::deque<T> deque(otherDeque);
    

    创建一个新的双端队列,并用 otherDeque 中的元素进行初始化。

这些构造函数可以根据需要选择使用,根据提供的参数不同,可以创建不同大小、不同初始化值的双端队列。

构造函数描述
std::deque<T> deque;默认构造函数,创建一个空的双端队列。
std::deque<T> deque(size);带有大小参数的构造函数,创建一个包含 size 个默认构造元素的双端队列。
std::deque<T> deque(size, value);带有大小和初始值参数的构造函数,创建一个包含 size 个初始值为 value 的元素的双端队列。
std::deque<T> deque(first, last);区间构造函数,创建一个包含范围 [first, last) 中的元素的双端队列。
std::deque<T> deque(otherDeque);拷贝构造函数,创建一个新的双端队列,并用 otherDeque 中的元素进行初始化。

注意,上述 T 表示模板参数,实际使用时需要根据具体的类型进行替换。构造函数的使用取决于你需要的功能和参数。

三.deque赋值操作

函数名函数原型描述
assign()void assign(size_type count, const T& value);将deque的内容设置为count个value
void assign(InputIterator first, InputIterator last);将deque的内容设置为从[first, last)范围内的元素
operator=deque& operator=(const deque& other);将一个deque的内容替换为另一个deque的内容

以上是deque的赋值操作函数的常用原型。根据具体的需求选择合适的函数进行使用。

四.deque的大小操作

函数名函数原型描述
empty()bool empty() const;检查deque是否为空
size()size_type size() const;返回deque中元素的个数
resize()void resize(size_type count);改变deque的大小,使其包含count个元素,多余的元素将被删除
void resize(size_type count, const T& value);改变deque的大小,使其包含count个元素,多余的元素使用value进行填充

五.deque的插入和删除操作

在C++中,deque(双端队列)提供了多种插入和删除操作的方法。下面是deque常用的插入和删除操作函数的示例:

  1. 在末尾插入元素:

    • push_back():在deque的末尾插入一个元素。
    • 示例代码:
      std::deque<int> myDeque;
      myDeque.push_back(10);
      
  2. 在开头插入元素:

    • push_front():在deque的开头插入一个元素。
    • 示例代码:
      std::deque<int> myDeque;
      myDeque.push_front(20);
      
  3. 在指定位置插入元素:

    • insert():在指定位置插入一个或多个元素。
      • 原型1:iterator insert (iterator position, const value_type& val);:在指定位置插入一个元素。
      • 原型2:void insert (iterator position, size_type n, const value_type& val);:在指定位置插入由n个相同值构成的元素。
    • 示例代码:
      std::deque<int> myDeque = {1, 2, 3};
      auto it = myDeque.begin();
      myDeque.insert(it, 5);      // 在开头插入 5
      myDeque.insert(it + 2, 7);  // 在第二个位置插入 7
      myDeque.insert(it + 4, 3, 9); // 在第四个位置插入三个 9
      
  4. 删除末尾的元素:

    • pop_back():删除deque的末尾元素。
    • 示例代码:
      std::deque<int> myDeque = {1, 2, 3};
      myDeque.pop_back();
      
  5. 删除开头的元素:

    • pop_front():删除deque的开头元素。
    • 示例代码:
      std::deque<int> myDeque = {1, 2, 3};
      myDeque.pop_front();
      
  6. 删除指定位置的元素:

    • erase():删除指定位置的一个或多个元素。
      • 原型1:iterator erase (iterator position);:删除指定位置的一个元素。
      • 原型2:iterator erase (iterator first, iterator last);:删除指定范围内的元素。
    • 示例代码:
      std::deque<int> myDeque = {1, 2, 3, 4, 5};
      auto it = myDeque.begin() + 2;  // 删除第三个元素
      myDeque.erase(it);
      
操作函数函数原型描述
push_back()void push_back(const T& value);在deque的末尾插入一个元素
push_front()void push_front(const T& value);在deque的开头插入一个元素
insert()iterator insert(iterator position, const T& value);在指定位置插入一个元素
void insert(iterator position, size_type count, const T& value);在指定位置插入由count个相同值构成的元素
iterator insert(iterator position, InputIterator first, InputIterator last);在指定位置插入从[first, last)范围内的元素,返回指向第一个插入元素的迭代器
pop_back()void pop_back();删除deque的末尾元素
pop_front()void pop_front();删除deque的开头元素
erase()iterator erase(iterator position);删除指定位置的一个元素
iterator erase(iterator first, iterator last);删除指定范围内的元素
clear()void clear();清空deque的所有元素

六. deque的数据存取

下面是将deque的索引和访问操作整理成表格:

索引/访问操作语法描述
at()reference at(size_type pos);返回指定位置上的元素的引用;如果越界,则抛出out_of_range异常
[]reference operator[](size_type pos);返回指定位置上的元素的引用;不进行越界检查
front()reference front();返回deque的第一个元素的引用
back()reference back();返回deque的最后一个元素的引用

使用这些操作函数,您可以根据索引访问deque中的元素,也可以直接访问前端和后端的元素。请注意,在使用[]操作符时,需要自己确保不会越界访问。根据具体需求,选择适合的操作方法来获取和访问deque中的元素。

七.函数接口

好的,补充完整的表格如下:

函数接口描述
push_back(x)在队列的尾部添加元素 x
push_front(x)在队列的头部添加元素 x
pop_back()移除队列尾部的元素
pop_front()移除队列头部的元素
size()返回队列中的元素个数
empty()判断队列是否为空,如果为空则返回 true,不为空则返回 false
clear()清空队列中的所有元素
at(pos)访问指定位置的元素
operator[]访问指定位置的元素
front()获取队列头部的元素
back()获取队列尾部的元素
begin()返回指向队列开头的迭代器
end()返回指向队列末尾(最后一个元素的下一个位置)的迭代器
rbegin()返回指向队列末尾的逆向迭代器(反向开始遍历)
rend()返回指向队列开头的逆向迭代器(反向结束遍历,相当于正向的末尾元素的下一个位置)
assign(iter_first, iter_last)将迭代器范围内的元素赋值给deque
assign(n, value)将deque中的元素数量修改为n,所有元素都设置为value
insert(pos, value)在pos位置插入单个元素
insert(pos, n, value)在pos位置插入n个值为value的元素
insert(pos, iter_first, iter_last)在pos位置插入迭代器范围内的元素
erase(pos)移除pos位置上的元素
erase(iter_first, iter_last)移除迭代器范围内的元素
swap(deque2)交换两个deque的内容
resize(num)修改deque中的元素数量,若num小于当前数量,会删除多余的元素
resize(num, value)修改deque中的元素数量,若num小于当前数量,会删除多余的元素,并将新增的元素赋值为value

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

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

相关文章

Linux高性能服务器编程 学习笔记 第四章 TCP/IP通信案例:访问Internet上的Web服务器

Web客户端和服务器之间使用HTTP协议通信。 我们按以下方式来部署通信实例&#xff1a;在Kongming20上运行wget客户端程序&#xff08;一个在命令行下使用的网络下载工具&#xff0c;它支持通过HTTP、HTTPS和FTP协议下载文件&#xff09;&#xff0c;在ernest-laptop上运行squi…

udp的简单整理

最近思考udp处理的一些细节&#xff0c;根据公开课&#xff0c;反复思考&#xff0c;终于有所理解&#xff0c;做整理备用。 0&#xff1a;简单汇总 1&#xff1a;udp是基于报文传输的&#xff0c;接收方收取数据时要一次性读完。 2&#xff1a;借助udp进行发包&#xff0c;…

车载软件架构 —— AUTOSAR Vector SIP包(一)

车载软件架构 —— AUTOSAR Vector SIP包(一) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

uniapp项目实践总结(十六)自定义下拉刷新组件

导语&#xff1a;在日常的开发过程中&#xff0c;我们经常遇到下拉刷新的场景&#xff0c;很方便的刷新游览的内容&#xff0c;在此我也实现了一个下拉刷新的自定义组件。 目录 准备工作原理分析组件实现实战演练内置刷新案例展示 准备工作 在components新建一个q-pull文件夹…

机器学习算法基础--Generalized Linear Regression Model

目录 1.数据的处理及查看 2.数据的处理及可视化 3.模型的创建与拟合 4.算法可视化效果图 5.多维度模型可视化 线性回归讲了很多次了&#xff0c;广义线性回归无非就是拟合的多项式曲线的次数的变化&#xff0c;就不再推导公式和算法流程了。 1.数据的处理及查看 import num…

人工智能轨道交通行业周刊-第60期(2023.9.11-9.17)

本期关键词&#xff1a;巡检机器人、重庆最强大脑、数字铁路规划、高铁起步、Baichuan 2大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMet…

​使用拥抱脸的稳定扩散世界 — 使用文本提示创建 AI 生成图像的扩散器库​

一、简介 你可能已经看到人工智能生成的图像有所增加&#xff0c;这是因为潜在扩散模型的兴起。简单来说&#xff0c;稳定扩散是一种深度学习模型&#xff0c;它可以在给定文本提示的情况下生成图像。 图1&#xff1a;稳定扩散概述 从上图可以看出&#xff0c;我们可以传递文本…

一次Python无法安装模块的问题探索与解决之旅

源起 在Windows 10系统中安装 Python 3.11.5版本&#xff08;目前最新版&#xff09;并安装模块 (比如flask)&#xff0c;安装步骤很简单&#xff1a; 到官方下载安装档https://www.python.org/downloads/点击安装文件安装Python到命令行执行 pip install packagename 安装扩…

基于SpringBoot的图书商城系统

基于SpringBootVue的网上书城系统、图书商城、网上书店系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1…

STM32F4X SPI W25Q128

STM32F4X SPI W25Q128 什么是SPISPI的特点SPI通信引脚SPI接线方式SPI速率SPI通信方式SPI时钟相位和时钟极性 STM32F4X SPISTM32F4X SPI配置STM32F4X SPI频率 W25Q128W25Q128存储结构W25Q128读写操作W25Q128常用指令读取ID命令(0x90)写使能命令(0x06)禁止写使能命令(0x04)读取W2…

7.前端·新建子模块与开发(自动生成)

文章目录 学习地址视频笔记自动代码生成模式开发增删改查功能调试功能权限分配 脚本实现权限分配 学习地址 https://www.bilibili.com/video/BV13g411Y7GS/?p15&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e 视频笔记 自动代码生成模式开发 …

30分钟吃掉YOLOv8实例分割范例

本范例我们使用 torchkeras来实现对 ultralytics中的YOLOv8实例分割模型进行自定义的训练&#xff0c;从而对气球进行检测和分割。 尽管ultralytics提供了非常便捷且一致的训练API&#xff0c;再使用torchkeras实现自定义训练逻辑似乎有些多此一举。 但ultralytics的源码结构相…

大众冰球运动水平等级评价规范

声明 本文是学习GB-T 42371-2023 大众冰球运动水平等级评价规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了大众冰球运动水平的等级和评价程序&#xff0c;规定了等级评价的总体要求以及评价要素、评 价要求&#xff0c;描…

408数据结构算法题目

408数据结构算法题目 408数据结构算法题目一、2020-411.1 题目描述1.2 分析1.3 代码1.3.1 暴力美学1.3.2 贪心 408数据结构算法题目 一、2020-41 1.1 题目描述 2020-41 41.(13分&#xff09; 定义三元组&#xff08;a,b,c)(a,b,c均为正数&#xff09;的距离D|a-b||b-c||c-a…

C++学习笔记--项目知识点集合

一、同步IO、异步IO、阻塞IO、非阻塞IO 首先来看看两种I/O的定义&#xff1a;同步I/O和异步I/O 同步&#xff08;阻塞&#xff09;I/O&#xff1a;在一个线程中&#xff0c;CPU执行代码的速度极快&#xff0c;然而&#xff0c;一旦遇到IO操作&#xff0c;如读写文件、发送网络…

【LeetCode-简单题KMP】459. 重复的子字符串

文章目录 题目方法一&#xff1a;移动匹配方法二&#xff1a;KMP算法 题目 方法一&#xff1a;移动匹配 class Solution {//移动匹配public boolean repeatedSubstringPattern(String s) {StringBuffer str new StringBuffer(s);//ababstr.append(s);//拼接一份自己 abababab…

TCP/IP协议栈的心跳、丢包重传、连接超时机制实例详解

大家好&#xff0c;本文结合具体的问题实例&#xff0c;详细讲解一下TCP/IP协议栈的心跳机制、丢包重传机制等内容&#xff0c;给大家提供一个借鉴和参考。 1、问题概述 虽然软件底层模块在网络恢复后能自动重连上服务器&#xff0c;但会议因为网络问题已经退出&#xff0c;需…

代码随想录|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III,188.买卖股票的最佳时机IV

121. 买卖股票的最佳时机 dp含义 dp[i][0] 表示第i天持有股票所得最多现金 ,dp[i][1] 表示第i天不持有股票所得最多现金 其实一开始现金是0&#xff0c;那么加入第i天买入股票现金就是 -prices[i]&#xff0c; 这是一个负数。 递推公式 第i天持有股票即dp[i][0],可以由两个…

Oracle数据库体系结构(三)_逻辑结构

Oracle逻辑存储结构,主要描述oracle 数据库内部数据的组织和管理方式&#xff0c;即在数据库管理系统的层面中如何组织和管理数据&#xff0c;与操作系统没有关系。逻辑存储结构时候物理存储机构的抽象体现&#xff0c;是不可见的&#xff0c;可以通过查询数据库数据字典了解逻…

RocketMq(一)安装部署

一、linux单机部署&#xff1a; 1、到apache官网下载 | RocketMQ (apache.org)下载binary zip包&#xff0c;如我下载的4.9.6版本。 上传到建好的/usr/local/rocketmq目录下。 2、解压zip包 unzip rocketmq-all-4.9.6-bin-release.zip 3、进入解压后的文件夹,启动 Name Serv…