C++进阶-STL deque容器的简单认识

news2025/1/16 16:02:26

STL deque容器的简单认识

    • deque容器的基本概念
      • deque和vector的区别
      • deque内部工作原理:
    • deque容器构造函数
    • deque容器赋值操作
    • deque容器大小操作
    • deque容器插入和删除
    • deque容器数据存取
    • deque容器排序操作

deque容器的基本概念

功能:双端数组,可以对头端进行插入删除操作

deque和vector的区别

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

在这里插入图片描述

deque内部工作原理:

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

deque迭代器也是支持随机访问的

deque容器构造函数

  • deque<T> deq; 默认构造函数
deque<string> deq;
  • deque(bug, end); 构造函数将[beg, end)区间中的元素拷贝给本身
deque<string> deq;
deque<string> deq_copy(deq.begin(), deq.end());
  • deque(n, elem); 构造函数将n个elem拷贝给本身
deque<string> deq(3, 10);
  • deque(const deque& dep); 拷贝构造函数
deque<string> deq;
deque<string> deq_copy(deq);

deque容器赋值操作

  • deque& operator=(const deque& deq); 重载等号运算符
deque<int> deq;
for (int i = 0; i < 10; i++)
{
    deq.push_back(i);
}
print(deq);
deque<int> deq_2 = deq;
print(deq_2);
  • assign(beg, end); 将[beg, end) 区间内的数据拷贝赋值给本身
deque<int> deq;
for (int i = 0; i < 10; i++)
{
    deq.push_back(i);
}
print(deq);
deque<int> deq_2;
deq_2.assign(deq.begin(), deq.end());
print(deq_2);
  • assign(n, elem); 将n个elem拷贝赋值给本身
deque<int> deq;
deq.assign(10, 8);
print(deq);

deque容器大小操作

  • deque.empty(); 判断容器是否为空
deque<int> deq;
deq.assign(10, 8);
std::cout << "deq 是否为空" << deq.empty() << std::endl;
  • deque.size(); 返回容器中元素的个数
deque<int> deq;
deq.assign(10, 8);
std::cout << "deq 大小" << deq.size() << std::endl;
  • deque.resize(); 更新指定容器的长度num, 若容器变长,则以默认值填充新位置,若容器变短,则超出末尾的长度的元素将被删除
deque<int> deq;
deq.assign(10, 8);
deq.resize(5);
print(deq);

result

  • deque.resize(num, elem); 重新指定容器的长度num,若容器变长将以elem值填充新位置,如果容器变短,末尾超出部分将被删除
deque<int> deq;
deq.assign(10, 8);
deq.resize(15, 2);
print(deq);

jieguo

deque容器插入和删除

  • push_back(elem); 在容器尾部添加一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
    deq.push_back(i);
}
print(deq);
  • push_front(elem); 在容器头部插入一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
    deq.push_front(i);
}
print(deq);
  • pop_back(); 删除容器最后一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
  	deq.push_front(i);
}
deq.pop_back();
print(deq);
  • pop_front(); 删除容器第一个元素
deque<int> deq;
for (int i = 0; i < 10; i++)
{
  	deq.push_front(i);
}
deq.pop_front();
print(deq);
  • insert(pos, elem); 在pos位置插入一个elem元素的拷贝,返回新数据的位置
 deque<int> deq;
 deque<int>::iterator it = deq.insert(deq.begin(), 12);
 std::cout << *it << std::endl;
 print(deq);

在这里插入图片描述

  • insert(pos, n, elem); 在pos位置插入n个elem的元素,无返回值
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
print(deq);

在这里插入图片描述

  • insert(pos, deb, end); 在pos位置插入[beg, end) 区间的数据,无返回值
 deque<int> deq;
 deq.insert(deq.begin(), 4, 12);
 print(deq);
 deque<int> deq_2;
 deq_2.insert(deq_2.begin(), deq.begin(), deq.end());
 print(deq_2);
  • clear(); 清空容器的所有操作
 deque<int> deq;
 deq.insert(deq.begin(), 4, 12);
 print(deq);
 deq.clear();
 print(deq);
  • erase(beg, end); 删除[beg, end)区间的数据,返回下一个数据的位置
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
deq.erase(deq.begin(), deq.end());
print(deq);
  • erase(pos); 删除pos位置的数据,返回下一个数据的位置
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
deq.erase(deq.begin());
print(deq);

deque容器数据存取

  • at(int idx); 返回索引idx所指的数据
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.at(1) << std::endl;
  • operator[]; 返回索引idx所指的数据
deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq[1] << std::endl;
  • front(); 返回容器中的第一个元素
在deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.font() << std::endl;
  • back(); 返回容器中最后一个元素
在deque<int> deq;
deq.insert(deq.begin(), 4, 12);
std::cout << deq.back() << std::endl;

deque容器排序操作

  • sort(iterator beg, iterator end); 对beg和end区间内的元素进行排序
    默认排序是从小到大,即升序排列
#include <iostream>
#include <deque>
#include <ctime>
#include <algorithm>
using namespace std;

void print(const deque<int>& deq)
{
    //const_iterator
    for (deque<int>::const_iterator it = deq.begin(); it != deq.end(); it++)
    {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
}

int main()
{
    srand((unsigned int)time(NULL));
    deque<int> deq;
    for (int i = 0; i < 10; i++)
    {
        int num = rand() % 60 + 40;
        deq.push_back(num);
    }
    std::cout << "排序前:" << std::endl;
    print(deq);
    sort(deq.begin(), deq.end());
    std::cout << "排序后:" << std::endl;
    print(deq);
}

运行结果
实际上,对于支持随机访问的迭代器,都可以利用sort算法进行排序,vector也可以使用sort排序

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

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

相关文章

RT-Thread系列09——ETH网口设备

文章目录 1. ETH测试第一步&#xff1a;cubemx配置。第二步&#xff1a;board.h配置。第三步&#xff1a;rtthread settings配置第四步&#xff1a;以太网复位引脚设置第五步&#xff1a;修改rtthread源码第六步&#xff1a;修改 cubemx 生成的 main 函数第七步&#xff1a;编译…

线程安全(JAVA)

线程安全对于我们编写多线程代码是非常重要的。 什么是线程安全&#xff1f; 在我们平时的代码中有些代码在单线程程序中可以正常执行&#xff0c;但如果同样的代码放在在多个线程中执行就会引发BUG&#xff0c;而这种现象我们一般称为 “线程安全问题” 或 “线程不安全”。…

漏洞复现--奇安信360天擎未授权访问

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

界面控件DevExtreme图表和仪表(v23.1) - 新功能(Angular,React,Vue,jQuery)

本文将为大家总结下DevExtreme在v23.1版本中发布的一些与图表和仪表盘相关的功能。 DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#…

TCP和UDP C#代码实战

网络传输的七层结构&#xff1a; 其中TCP和UDP协议在传输层。 TCP/IP协议 TCP/IP中包含了四层架构中的多个协议&#xff0c;取其中两个进行了命名&#xff1a; TCP TCP的特点 粘包问题处理 TCP一次性接收过多数据必然出现粘包&#xff0c;即不同时发送的数据黏连在一…

OV5640的参数与配置方法

分辨率和速率&#xff08;FPS&#xff09; 寄存器配置 I/O 板的驱动能力和方向控制 system clock control OV5640 PLL 允许输入时钟频率范围为 6~27 MHz&#xff0c;最大 VCO 频率为 800 MHz。 MipiClk 用于 MIPI&#xff0c;SysClk 用于图像信号处理 (ISP) 模块的内部时钟。 …

网络营销利器:海外IP代理如何助力你的网络营销?如何选择?

在当今数字化的时代&#xff0c;网络营销已经成为企业营销策略的重要组成部分。而对于进去海外市场的跨境玩家来说&#xff0c;海外的推广营销是重中之重。然而&#xff0c;在开展网络营销的过程中&#xff0c;我们常常会遇到各种挑战&#xff0c;如地域限制、访问速度慢等。 …

力扣每日一道系列 --- LeetCode 88. 合并两个有序数组

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 思路1&#xff1a;暴力求解思路2&#xff1a;原地合并 LeetCode 88. 合并两个有序数组…

Docker - 镜像

Docker - 镜像 镜像是什么 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;包括代码&#xff0c;运行时&#xff0c;库&#xff0c;环境变量和配置文件。…

数据结构与算法(一)数据结构基础

目录 一、绪论1.1 什么是程序 二、算法2.1 定义2.2 特性2.3 算法时间效率2.4 时间复杂度1&#xff09;大 O 阶推导法&#xff1a;2&#xff09;举个例子&#xff1a;3&#xff09;常见的时间复杂度 2.5 空间复杂度1&#xff09;计算方法2&#xff09;存储空间 2.6 常见算法的时…

Yolov5 + 界面PyQt5 +.exe文件部署运行

介绍 Yolov5是一种基于深度学习的目标检测算法&#xff0c;PyQt5是一个Python编写的GUI框架&#xff0c;用于创建交互式界面。在部署和运行Yolov5模型时&#xff0c;结合PyQt5可以方便地创建一个用户友好的界面&#xff0c;并将代码打包为.exe文件以供其他人使用。 下面是一个…

虚拟化服务器+华为防火墙+kiwi_syslog访问留痕

一、适用场景 1、大中型企业需要对接入用户的访问进行记录时&#xff0c;以前用3CDaemon时&#xff0c;只能用于小型网络当中&#xff0c;记录的数据量太大时&#xff0c;本例采用破解版的kiwi_syslog。 2、当网监、公安查到有非法访问时&#xff0c;可提供基于五元组的外网访…

在全志XR806上移植st7789屏幕驱动

前言 很高兴有机会参加本次极术社区举办的“「免费试用」搭载安谋科技STAR-MC1的全志XR806 Wi-FiBLE 开发板试用活动”。 去年就对全志的mcu芯片感兴趣了&#xff0c;一直没有机会接触&#xff0c;看到本次极术社区提供的全志wifi BLE开发板试用&#xff0c;就马上参加了。板…

WebGL智慧城市软件项目

WebGL开发智慧城市项目时&#xff0c;需要考虑多个方面&#xff0c;包括技术、隐私、安全和可持续性。以下是一些需要注意的关键问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.隐私和数据安全…

6.3二叉树的层序遍历(LC102,LC107-M)

二叉树的层序遍历&#xff08;LC102&#xff09;&#xff1a; 算法&#xff08;长度法&#xff09;&#xff1a; 需要借用一个辅助数据结构即队列来实现&#xff0c;队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归…

【外部服务对接】对接Firebase支持谷歌、Facebook、苹果等第三方平台用户注册登录

【外部服务对接】对接Firebase支持谷歌、Facebook、苹果等第三方平台登录 背景 因主要做国外尼日的市场&#xff0c;相关的应用的全是国外用户使用&#xff0c;为了方便用户的注册和登录&#xff0c;接入国外的统一平台Firebase,集成使用很方便。 主要步骤 1.注册登录Fireb…

如何提高小红书笔记的互动率

相信有很多新手在运营小红书的时候&#xff0c;可能都会遇到过以下这样的情况&#xff1a; 笔记点赞、收藏数据明明还可以&#xff0c;但评论区却没有人留言&#xff1f;为何大家只给点赞、收藏&#xff0c;却不关注账号&#xff1f; 其实&#xff0c;这背后有很多运营技巧&a…

​做好研发管理的三个条件​

1.制造鼓励创新的环境 要做好研发管理&#xff0c;首先要制造一个鼓励创新、适合研发的环境&#xff0c;必须采取弹性而目标化的管理&#xff0c;不以死板的制度限制员工的创意&#xff0c;必须要求实质的成果。 2.融入行销观念 将行销的观念融入研发中&#xff1a;为使有限的…

xlua游戏热更新(lua访问C#)

CS.UnityEngine静态方法访问unity虚拟机 创建游戏物体 CS.UnityEngine.GameObject(new by lua);静态属性 CS.UnityEngine.GameObject(new by lua); -- 创建 local camera CS.UnityEngine.GameObject.Find(Main Camera); --查找 camera.name Renamed by Lua;访问组件 loca…

通配符匹配

题目链接 通配符匹配 题目描述 注意点 s 仅由小写英文字母组成p 仅由小写英文字母、‘?’ 或 ‘*’ 组成‘?’ 可以匹配任何单个字符‘*’ 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09; 解答思路 最初想到的是dfs 剪枝&#xff0c;但是用例超时了参照题…