【C++】STL的deque容器

news2024/11/20 18:25:20

目录

3.1deque构造函数

3.2deque赋值操作

3.3deque大小操作

3.4deque插入

3.5deque删除

3.6deque数据存取

3.7deque排序操作


deque(双端队列)是double-ended queue 的一个不规则缩写。deque是具有动态大小的序列容器,可以在两端(前端或后端)扩展或收缩。

特定的库可以以不同的方式实现deques,通常作为某种形式的动态数组。但是在任何情况下,它们都允许通过随机访问迭代器直接访问各个元素,通过根据需要扩展和收缩容器来自动处理存储。

因此,它们提供了类似于vector的功能,但是在序列的开始部分也可以高效地插入和删除元素,而不仅仅是在结尾。但是,与vector不同,deques并不保证将其所有元素存储在连续的存储位置:deque通过偏移指向另一个元素的指针访问元素会导致未定义的行为。

两个vector和deques提供了一个非常相似的接口,可以用于类似的目的,但内部工作方式完全不同:虽然vector使用单个数组需要偶尔重新分配以增长,但是deque的元素可以分散在不同的块的容器,容器在内部保存必要的信息以提供对其任何元素的持续时间和统一的顺序接口(通过迭代器)的直接访问。因此,deques在内部比vector更复杂一点,但是这使得他们在某些情况下更有效地增长,尤其是在重新分配变得更加昂贵的很长序列的情况下。

对于频繁插入或删除开始或结束位置以外的元素的操作,deques表现得更差,并且与列表和转发列表相比,迭代器和引用的一致性更低。

 deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素,因此也叫做双端队列

使用deque容器一定要包含头文件

#include <deque>

3.1deque构造函数

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

测试案例代码:
int main(void)
{
        deque<int> d1; //无参构造函数
        for (int i = 0; i < 10; i++)
        {
            d1.push_back(i);
        }
        printDeque(d1);
        deque<int> d2(d1.begin(), d1.end());
        printDeque(d2);
    
        deque<int>d3(10, 100);
        printDeque(d3);
    
        deque<int>d4 = d3;
        printDeque(d4);
    
        return 0;
}

3.2deque赋值操作

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

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

测试案例代码:
int main(void)
{
        deque<int> d1;
        for (int i = 0; i < 10; i++)
        {
            d1.push_back(i);
        }
        printDeque(d1);
    
        deque<int>d2;
        d2 = d1;
        printDeque(d2);
    
        deque<int>d3;
        d3.assign(d1.begin(), d1.end());
        printDeque(d3);
    
        deque<int>d4;
        d4.assign(10, 100);
        printDeque(d4);
    
        return 0;
}

3.3deque大小操作

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

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

测试案例代码:
int main(void)
{
        deque<int> d1;
        for (int i = 0; i < 10; i++)
        {
            d1.push_back(i);
        }
        printDeque(d1);
    
        //判断容器是否为空
        if (d1.empty()) {
            cout << "d1为空!" << endl;
        }
        else {
            cout << "d1不为空!" << endl;
            //统计大小
            cout << "d1的大小为:" << d1.size() << endl;
        }
    
        //重新指定大小
        d1.resize(15, 1);
        printDeque(d1);
    
        d1.resize(5);
        printDeque(d1);
    
        return 0;
}

3.4deque插入

功能描述:向deque容器中插入数据

push_back(elem);        //在容器尾部添加一个数据
push_front(elem);       //在容器头部插入一个数据
insert(pos,elem);       //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);     //在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);    //在pos位置插入[beg,end)区间的数据,无返回值。

测试案例代码:
int main(void)
{
    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_front(100);
    d.push_front(200);
        printDeque(d);
    
        d.insert(d.begin(), 1000);
        printDeque(d);
    
        d.insert(d.begin(), 2, 10000);
        printDeque(d);

    deque<int>d2;
    d2.push_back(1);
    d2.push_back(2);
    d2.push_back(3);
    
        d.insert(d.begin(), d2.begin(), d2.end());
        printDeque(d);
    
        deque<int> d3;
        //尾插
        d3.push_back(10);
        d3.push_back(20);
        //头插
        d3.push_front(100);
        d3.push_front(200);
        printDeque(d3);
    
        return 0;
}

3.5deque删除

功能描述:向deque容器中删除数据

pop_back();                  //删除容器最后一个数据
pop_front();                 //删除容器第一个数据
clear();                     //清空容器的所有数据
erase(beg,end);              //删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);                  //删除pos位置的数据,返回下一个数据的位置。

测试案例代码:
int main(void)
{
    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_front(100);
    d.push_front(200);
        printDeque(d);
    
        d.erase(d.begin());
        printDeque(d);
    
        d.erase(d.begin(), d.end());
        d.clear();
        printDeque(d);

    return 0;
}

3.6deque数据存取

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

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

测试案例代码:
int main(void)
{
    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_front(100);
    d.push_front(200);

        for (int i = 0; i < d.size(); i++) {
            cout << d[i] << " ";
        }
        cout << endl;
    
    
        for (int i = 0; i < d.size(); i++) {
            cout << d.at(i) << " ";
        }
        cout << endl;
    
        cout << "front:" << d.front() << endl;
    
        cout << "back:" << d.back() << endl;
    
        return 0;
}

3.7deque排序操作

功能描述:利用算法实现对deque容器进行排序(需要包含头文件algorithm)

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

测试案例代码:
int main(void)
{
    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_front(100);
    d.push_front(200);

        printDeque(d);
        sort(d.begin(), d.end());
        printDeque(d);
    
        return 0;    
}

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

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

相关文章

遗传算法[GA]

遗传算法 遗传算法 (Genetic Algorithm&#xff0c;GA) 是模拟生物在自然环境中的遗传和进化的过程而形成的自适应 全局优化搜索算法。 遗传算法借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种并行、高效、全局搜索的方法&#xff0c; 它能在搜索过程中自动获取和积累…

centos直接部署express

centos直接部署express 以下是在CentOS上部署Express应用程序的一般步骤&#xff1a; 1.安装Node.js 在CentOS系统上安装Node.js。可以使用以下命令安装Node.js&#xff1a; sudo yum install nodejs2.安装npm 安装完Node.js后&#xff0c;还需要安装npm&#xff08;Node.…

数据库原理与应用第7章作业

数据库原理与应用第7章作业 一. 单选题&#xff08;共10题&#xff0c;40分&#xff09;二. 填空题&#xff08;共3题&#xff0c;15分&#xff09;三. 简答题&#xff08;共1题&#xff0c;15分&#xff09;四. 论述题&#xff08;共2题&#xff0c;30分&#xff09; 一. 单选…

测试“背锅侠”?软件测试人究竟背了多少锅?我不再背锅...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 实际上&#xff0…

多线程并发的一些常见的使用规范

目录 1. 多线程并发使用规范 1.1 指定线程名称 2. 尽量使用线程池 3.不允许使用Executors 4. 正确停止线程 5. 编写可停止的Runnable 6 . Runnable中必须捕获一切异常 7. 可考虑使用ThreadLocal 8. 缩短锁 9. 选择分离锁&#xff0c;分散锁甚至无锁的数据结构 10. 推…

【C/C++】标准库相关题型(一)

文章目录 1. vector底层实现原理1.1 类构成1.2 构造函数1.3 插入元素1.4 删除元素1.5 读取元素1.6 修改元素1.7 释放空间 2. vector内存增长机制2.1 特点2.2 内存增长特性2.3 内存增长过程2.4 内存清理2.5 注意事项 3. vector中reserve和resize的区别3.1 共同点3.2 区别3.3 应用…

在 ZBrush 和 Maya 中创建 Chris Hemsworth 的 3D 肖像

今天瑞云渲染小编给大家带来一篇Marius Prsel分享了 Chris Hemsworth 项目背后的工作过程&#xff0c;详细介绍了角色的头部、面部和头发是如何制作的&#xff0c;并解释了如何在 Arnold 中完成渲染&#xff0c;一起来看看吧&#xff01; 简介 我的名字是Marius Prsel&#xf…

7个理由:从Java8升级到Java17【翻译】

原文地址: 7 Reasons to Migrate from Java 8 to Java 17 释放吧&#xff0c;Java的全部力量。[手动狗头] 简介 从Java8到Java18&#xff0c;Java已经经历了漫长的发展历程&#xff08;Java20非长期维护版本&#xff09;。同时也是从Java 8开始&#xff0c;Java生态系统发生…

【LeetCode热题100】打卡第23天:最小覆盖子集

文章目录 【LeetCode热题100】打卡第23天&#xff1a;最小覆盖&子集⛅前言 最小覆盖&#x1f512;题目&#x1f511;题解 子集&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第23天&#xff1a;最小覆盖&子集 ⛅前言 大家好&#xff0c;我是知识汲取者&…

三种方法将Word文档转换为PDF文件格式

如何将Word文档转换为PDF文件格式呢&#xff1f;大家在传输文件时&#xff0c;很多人喜欢使用PDF文件格式&#xff0c;因为它非常稳定&#xff0c;不会出现格式混乱的问题。但有些人可能不知道如何进行转换&#xff0c;今天我将介绍三种转换方法&#xff0c;让我们一起来学习一…

从0开始,精通Go语言Rest微服务架构和开发

说在前面 现在拿到offer超级难&#xff0c;甚至连面试电话&#xff0c;一个都搞不到。 尼恩的技术社区中&#xff08;50&#xff09;&#xff0c;很多小伙伴凭借 “左手云原生右手大数据”的绝活&#xff0c;拿到了offer&#xff0c;并且是非常优质的offer&#xff0c;据说年…

Pytest教程__Hook钩子函数总结(14)

前言 pytest 的钩子函数有很多&#xff0c;通过钩子函数的学习可以了解到pytest在执行用例的每个阶段做什么事情&#xff0c;也方便后续对pytest二次开发学习。 详细文档可以查看pytest官方文档API Reference — pytest documentation 钩子函数总结 第一部分&#xff1a;set…

5、DuiLib组件结构的初探

文章目录 1、DuiLib组件结构的初探 1、DuiLib组件结构的初探 DuiLib 整体的实现不仅仅有控件&#xff0c;还有窗口消息、XML处理等模块&#xff0c;官方曾经过出的一个结构图如下&#xff1a; 图中还是比较详细的描述了 DuiLib 的整体设计&#xff0c;值得注意的部分是 “窗口…

每日一练 | 华为认证真题练习Day61

1、DHCPv6服务器发送的DHCPv6 ADVERTISE报文目的端口号为&#xff1f; A. 548 B. 547 C. 549 D. 546 2、当DHCPv6客户端收到DHCPv6服务器发送的RA报文中的和O标记位取值为下列哪个数值时&#xff0c;DHCPv6客户端采用DHCPv6有状态自动配置获取IPv6地址和其它配置信息&#…

Android libusb库的使用

Download Data Center Software from Total Phase. 1 Aptiv DABR Aptiv acquired Indian Unwired&#xff0c;Delphi Automotive USB Bridge / Hub&#xff0c;Hub中集成了UDC&#xff0c;upstream UDC连接的主机称为A-Host&#xff0c;downstream UDC被B-Host枚举成Relay devi…

一个床垫的故事

这是学习笔记的第 2460篇文章 这是一个床垫的真实故事&#xff0c;想起来还是蛮感慨的&#xff0c;真是太魔幻了。 起因是我哥搬家&#xff0c;有一个很新的品牌床垫&#xff0c;因为新房子那边买家具已经送了一个床垫了&#xff0c;所以就多出来一个床垫&#xff0c;他打算把…

autogpt的使用,还有出现的问题

AutoGPT简介 AutoGPT是一个实验性开源应用程序&#xff0c;展示了GPT-4语言模型的功能。该程序由GPT-4驱动&#xff0c;将LLM“思想”链接在一起&#xff0c;以自主实现您设定的任何目标。作为GPT-4完全自主运行的首批例子之一&#xff0c;AutoGPT突破了人工智能的极限。 注&a…

Opencv-C++笔记 (6) : opencv-图片和视频操作

文章目录 一、读取函数imread二、图片窗口函数namedWindow三、 图片保存Imwrite和显示函数Imshow四、视频数据的读取五、摄像头直接调用 一、读取函数imread cv::Mat cv::imread(const String & filename,int flagsIMREAD_COLOR)filename&#xff1a;需要读取图像的文件名…

Linux运维监控学习笔记4

Zabbix相关的一些概念&#xff1a; Zabbix用户和用户群组&#xff1a; 用户&#xff1a;Zabbix提供多用户管理&#xff0c;不同的用户可以设置不同的权限&#xff0c;不同的语言和不同的报警方式。 1&#xff09;创建用户&#xff1a;点击“创建用户”按钮&#xff1a; 2&…

NOTA PEG7 Azide,NOTA-七聚乙二醇叠氮,新型双功能整合剂

NOTA PEG7 Azide中NOTA及其衍生物是新型双功能整合剂之一。NOTA及其衍生物具有良好的配位和鳌合能力&#xff0c;可作为过渡金属离子的配体。叠氮化物基团可以参与铜催化的与炔部分的点击化学反应。 聚乙二醇在科研领域运用广泛&#xff0c;聚乙二醇具有良好的水溶性&#xff0…