【C++】STL(四) deque容器

news2024/10/5 16:27:37

4、deque容器

4.1 简介

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

② deque与vector区别:

vector对于头部的插入效率低,数据量越大,效率越低,例如头部后有十万个数据,则往头部插入一个数据时,十万个数据都需要往后挪一挪才能在头部插入数据。
deque相对而言,对头部的插入删除速度会比vector快
vector访问元素时的速度会比deque快,这和两者内部实现有关。
在这里插入图片描述

③ deque内部工作原理:

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

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

4.2 构造函数

① 功能描述:deque容器构造。

函数原型

函数原型:
    deque<T> deqT;            //默认构造形式
    deque(beg, end);          //构造函数将[beg, end)区间中的元素拷贝给本身。
    deque(n, elem);           //构造函数将n个elem拷贝给本身。
    deque(const deque &deq);  //拷贝构造函数

③ deque荣哪个器和vector容器的构造方式几乎一致,灵活使用即可。

例子

void dequetest01()
{
    deque<int> d1;
    for (int i = 0; i < 10; i++)
    {
        d1.push_back((i+1) * 10);
    }
    PrintDeque(d1);

    deque<int> d2(d1.begin(), d1.end());
    PrintDeque(d2);

    deque<int> d3(10, 2);
    PrintDeque(d3);

    deque<int> d4(d3);
    PrintDeque(d4);
}

在这里插入图片描述

4.3 赋值操作

① 功能描述:给deque容器进行赋值。

② 函数原型:

函数原型:
    deque& operator=(const deque &deq);  //重载等号操作符
    assign(beg, end);                    //将[beg, end)区间中的数据拷贝赋值给本身。
    assign(n, elem);                     //将n个elem拷贝赋值给本身。

③ deque赋值操作与vector相同。

例子

void dequetest02()
{
    deque<int> d1(10, 8);
    PrintDeque(d1);

    deque<int> d2 = d1;
    PrintDeque(d2);

    deque<int> d3(d1.begin(), d1.end());
    PrintDeque(d3);
}

在这里插入图片描述

4.4 大小操作

① 功能描述:对deque容器的大小进行操作。

② 函数原型:

函数原型:
    deque.empty(); //判断容器是否为空
    deque.size(); //返回容器中元素的个数
    deque.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
                       //如果容器变短,则末尾超出容器长度的元素被删除。
    deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
                             //如果容器变短,则末尾超出容器长度的元素被删除。

例子

void dequetest03()
{
    deque<int> d1;
    for (int i = 0; i < 10; i++)
    {
        d1.push_back(i + 5);
    }
    if (!d1.empty())
    {
        PrintDeque(d1);
    }
    cout << "d1大小为: " << d1.size() << endl;

    d1.resize(15);
    PrintDeque(d1);

    d1.resize(5);
    PrintDeque(d1);


    d1.resize(10, 15);
    PrintDeque(d1);

    d1.resize(3, 9);
    PrintDeque(d1);
}

在这里插入图片描述

4.5 插入和删除

① 功能描述:向deque容器中插入和删除数据。

② 函数原型:

函数原型:
两端插入操作:
    push_back(elem);     //在容器尾部添加一个数据
    push_front(elem);    //在容器头部插入一个数据
    pop_back();          //删除容器最后一个数据
    pop_front();         //删除容器第一个数据
指定位置操作:
    insert(pos,elem);    //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
    insert(pos,n,elem);  //在pos位置插入n个elem数据,无返回值。
    insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
    clear();             //清空容器的所有数据
    erase(beg,end);      //删除[beg,end)区间的数据,返回下一个数据的位置。
    erase(pos);          //删除pos位置的数据,返回下一个数据的位置。

例子

void dequetest04()
{
    deque<int> d1;
    for (int i = 1; i <= 10; i++)
    {
        d1.push_back(i * 3); //尾插
    }
    for (int i = 1; i <= 10; i++)
    {
        d1.push_front(i * 5); //头插
    }
    PrintDeque(d1);

    d1.pop_back(); //尾删
    PrintDeque(d1);
    d1.pop_front();//头删
    PrintDeque(d1);

    d1.insert(d1.begin(), 100);
    PrintDeque(d1);
    d1.insert(d1.cbegin(), 3, 999);
    PrintDeque(d1);

    deque<int>::iterator it = d1.begin();
    it += 4;
    d1.erase(it);
    PrintDeque(d1);

    d1.erase(it+2,it+12);
    PrintDeque(d1);

    d1.clear();//清空
    PrintDeque(d1); 
}

在这里插入图片描述

4.6 数据存取

① 功能描述:对deque中的数据的存取操作。

② 函数原型:

函数原型:
    at(int idx);     //返回索引idx所指的数据
    operator[];      //返回索引idx所指的数据
    front();         //返回容器中第一个数据元素
    back();          //返回容器中最后一个数据元素

③ 除了用迭代器获取deque容器中元素,[]和at也可以。

例子

void dequetest05()
{
    deque<int> d1;
    for (int i = 1; i < 10; i++)
    {
        d1.push_back(i);
    }

    for (int i = 0; i < d1.size(); i++)
    {
        cout << d1[i] << " ";
    }
    cout << endl;

    for (int i = 0; i < d1.size(); i++)
    {
        cout << d1.at(i) << " ";     //通过 at 访问
    }
    cout << endl;

    cout << d1.front() << endl;
    cout << d1.back() << endl; 
}

在这里插入图片描述

4.7 排序

① 利用算法实现对deque容器进行排序。

② 算法:

算法:
    sort(iterator beg, iterator end) //对beg和end区间内元素进行排序

③ sort算法非常实用,使用时包含头文件algorithm即可。

例子

void dequetest06()
{
    deque<int> d1;
    d1.push_front(23);
    d1.push_back(6);
    d1.push_front(34);
    d1.push_back(78);
    d1.push_front(7);
    d1.push_back(72);
    d1.push_front(37);
    d1.push_back(46);
    d1.push_front(17);
    d1.push_back(48);
    PrintDeque(d1);

    sort(d1.begin(), d1.end());
    PrintDeque(d1);

}

在这里插入图片描述

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

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

相关文章

掘根宝典之C++迭代器简介

在C中&#xff0c;容器是一种用于存储和管理数据的数据结构。C标准库提供了多种容器&#xff0c;每种容器都有其独特的特点和适用场景。 我们知道啊&#xff0c;我们可以通过下标运算符来对容器内的元素进行访问&#xff0c;但是只有少数几种容器才同时支持下标运算符&#xf…

#车载诊断协议DoIP系列 —— 套接字处理 在线检查

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,四海皆为家。人生的面吃一…

Java中 final、finally、finalize 有什么区别?

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字&#xff0c;它们除了长得像之外&#xff0c;其他的&#xff08;作用和含义&#xff09;完全不同。 它们三个的区别就好像&#xff1a;雷、雷锋、雷峰塔之间的区别。&#xff08;是三个完全不同的东西&#…

【动态规划】C++算法312 戳气球

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode312 戳气球 有 n 个气球&#xff0c;编号为0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums…

基于springboot+vue实现教学改革项目管理系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现教学改革项目管理系统演示 摘要 教学改革行业的不断发展才能让更多的学生受益&#xff0c;那么教学改革的老师们对于教改可谓是花费了很大的心血。这种心血不仅仅在教学方式方法上&#xff0c;而且还是在于线下的流程审批和审核及教学改革的项目资料整理…

便携式隧道能见度仪的使用

TH-BN6随着交通基础设施的不断发展&#xff0c;隧道作为连接城市、山区等关键地段的交通要道&#xff0c;发挥着越来越重要的作用。然而&#xff0c;隧道内的能见度问题一直是困扰隧道运营者的难题。为了保障隧道通行安全&#xff0c;便携式隧道能见度仪应运而生。 二、便携式隧…

解忧杂货铺(①):必备网站资源

目录 在线工具 简单教程 程序员导航网 中国大学 青柠 廖雪峰的官方网站 在线工具 各类工具 https://tool.lu/ 简单教程 简单教程 https://www.twle.cn/ 程序员导航网 程序员导航网 https://hao.panziye.com/ 中国大学 中国大学MOOC网 https://www.icourse163.org/ 青…

Python 对Excel工作表中的数据进行排序

在Excel中&#xff0c;排序是整理数据的一种重要方式&#xff0c;它可以让你更好地理解数据&#xff0c;并为进一步的分析和报告做好准备。本文将介绍如何使用第三方库Spire.XLS for Python通过Python来对Excel中的数据进行排序。包含以下三种排序方法示例&#xff1a; 按数值…

数字脉搏:互联网的演进与社会脉络

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

深入理解快速排序

一、快速排序 快速排序是冒泡排序的一种改进算法&#xff0c;相比于冒泡排序效率更优。 算法过程分析&#xff1a; 通过采用分治策略&#xff0c;围绕一个 x 将原始数组划分为两个子数组&#xff0c;使得前一个子数组的元素≤ x ≤ 后一个子数组元素&#xff0c;对两个子数组进…

诗词生成之setting

先上代码&#xff1a; # 禁用词&#xff0c;包含如下字符的唐诗将被忽略 DISALLOWED_WORDS [&#xff08;, &#xff09;, (, ), __, 《, 》, 【, 】, [, ]] # 句子最大长度 MAX_LEN 64 # 最小词频 MIN_WORD_FREQUENCY 8 # 训练的batch size BATCH_SIZE 16 # 数据集路径 DA…

如果电脑缺少dll文件怎么解决?如何快速解决dll丢失问题

最近有小伙伴问电脑老是缺少dll文件&#xff0c;这种问题到底要怎么去解决呢&#xff1f;其实这种现象是正常的&#xff0c;为啥说正常呢&#xff0c;下面我们会给大家详细的讲解dll为啥会缺少&#xff0c;然后还会讲解电脑缺少dll文件怎么解决的方法&#xff0c;好了&#xff…

Day17:开发流程、开发社区首页、项目的调试、版本控制

开发流程 一次请求过程 先开发DAO&#xff0c;再开发service&#xff0c;再开发controller 开发社区首页的分布实现 显示前10个帖子 创建帖子数据表 CREATE TABLE discuss_post (id int NOT NULL AUTO_INCREMENT,user_id varchar(45) DEFAULT NULL,title varchar(100) DEF…

社交创新的先锋:探秘Facebook背后的故事与智慧

起源与初创阶段 Facebook的故事始于2004年&#xff0c;由马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;、埃迪华索伦&#xff08;Eduardo Saverin&#xff09;、安德鲁麦克卡拉姆&#xff08;Andrew McCollum&#xff09;、克里斯休斯&#xff08;Chris Hughes&#x…

Java进程CPU高负载排查

Java进程CPU高负载排查步骤_java进程cpu使用率高排查_YouluBank的博客-CSDN博客 【问题定位】使用arthas定位CPU高的问题_arthas cpu高_秋装什么的博客-CSDN博客 CPU飙升可能原因 CPU 上下文切换过多。 对于 CPU 来说&#xff0c;同一时刻下每个 CPU 核心只能运行-个线程&…

JAVA实战开源项目:生活废品回收系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

最新APP开发趋势,探索2024年的创新与挑战

2024年&#xff0c;移动应用市场仍然是创新与变革的焦点。随着技术的不断发展和用户需求的不断变化&#xff0c;APP开发行业也在不断演进。本文将深入探讨2024年最新的APP开发趋势&#xff0c;以及所带来的创新与挑战&#xff0c;并介绍虎克技术公司提出的解决方案。 1. 强调用…

AIGC笔记--Maya提取和修改FBX动作文件

目录 1--Maya数据解析 2--FBX SDK导出6D数据 3--6D数据映射和Maya可视化 完整项目代码&#xff1a;Data-Processing/FBX_SDK_Maya 1--Maya数据解析 在软件Maya中直接拖入FBX文件&#xff0c;可以播放和查看人体各个骨骼关节点的数据&#xff1a; 对于上图来说&#xff0c;…

【傻瓜文档】鼎利测试软件Pilot Pioneer-① Pioneer界面介绍

Pioneer界面分布 工具栏 自定义快速访问工具栏 根据需求&#xff0c;自行制定工具栏选项 菜单栏 文件 语言 配置 工具 工具栏的补充内容&#xff0c;常用的有&#xff1a;合并/分割数据、GPS轨迹补偿等等。 帮助