C++——deque的了解和使用

C++——deque的了解和使用

目录

引言

标准库中的deque

一、deque的基本概念

二、deque的常用接口

1.deque的迭代器

2.deque的初始化

3.deque的容量操作

3.1 有效长度和容量大小

3.2 有效长度和容量操作

4.deque的访问操作

5.deque的修改操作

三、deque的应用场景

结束语


引言

在C++中,deque是STL(标准模板库)提供的一种容器类,专门用于存储各种类型的元素,并支持在两端进行快速的插入和删除操作。今天我们就试着来学习一下这一数据结构。

 

标准库中的deque

一、deque的基本概念

Deque是一种线性数据结构,它允许在两端进行插入和删除操作。这两端通常被称为前端(front)和后端(rear),或者端点1和端点2。Deque的灵活性在于,它既可以用作队列(FIFO,先进先出),也可以用作栈(LIFO,后进先出),具体取决于元素的插入和删除操作是在哪一端进行的。deque是C++STL(标准模板库)中的一种容器,可以用于存储各种类型的元素。deque的特点是可以在队列的两端进行元素的操作,并且可以高效地在队列的任意位置进行元素的插入和删除操作。

二、deque的常用接口

1.deque的迭代器

与string和vector类似,deque也有迭代器。

由于deque定义在deque类中,因此我们想要使用deque的迭代器需要通过域作用限定符访问——deque<类型>::iterator 。

其中,begin(),end(),rbeign(),rend()的使用访问方法与string和vector的使用方法类似。

我们来看代码:

int main() { deque<int> d = { 0,1,2,3,4, }; deque<int>::iterator it = d.begin(); cout << "顺序遍历:"; while (it != d.end()) { cout << *it << " "; ++it; } cout << endl; cout << "逆序遍历:"; deque<int>::reverse_iterator rit = d.rbegin(); while (rit != d.rend()) { cout << *rit << " "; ++rit; } return 0; }

输出结果为:

2.deque的初始化

来看代码演示:

void Print(deque<int>& d) { for (deque<int>::iterator it = d.begin(); it != d.end(); ++it) { cout << *it << " "; } cout << endl; } int main() { deque<int> d1; for (int i = 0; i < 5; ++i) { d1.push_back(i); } deque<int> d2(d1.begin(), d1.end()); deque<int> d3(5, 5); deque<int> d4(d3); cout << "打印d1: "; Print(d1); cout << "打印d2: "; Print(d2); cout << "打印d3: "; Print(d3); cout << "打印d4: "; Print(d4); return 0; }

输出结果为:

3.deque的容量操作

下面是关于deque的容量操作:

函数名称功能
size返回deque的有效长度
clear清空deque
empty检查deque是否为空,是则返回ture,否则返回false
resize重新设置有效元素的数量,超过原来有效长度则用c字符填充

3.1 有效长度和容量大小

deque没有capacity接口。deque,即双端队列(Double Ended Queue),是一个双向开口的连续线性空间,允许在头尾两端分别进行插入和删除操作。其特性决定了它不需要像某些其他数据结构(如vector)那样具有固定的容量(capacity)概念。

下面是简单的测试用例:

int main() { deque<int> d = { 0,1,2,3,4 }; cout << d.size() << endl; if (d.empty()) { cout << "d为空" << endl; } else { cout << "d不为空" << endl; } d.clear(); if (d.empty()) { cout << "d为空" << endl; } else { cout << "d不为空" << endl; } return 0; }

3.2 有效长度和容量操作

deque这个容器没有提供reserve接口,接下来我们来学习一下resize这个接口:

resize()与我们之前学习的string、vector用法一致,在这里就不多介绍了

来看代码演示:

int main() { deque<int> d = { 1,2,3,4,5 }; d.resize(3); for (int i = 0; i < d.size(); i++) { cout << d[i] << " "; } cout << endl; d.resize(4); for (int i = 0; i < d.size(); i++) { cout << d[i] << " "; } cout << endl; d.resize(5, 9); for (int i = 0; i < d.size(); i++) { cout << d[i] << " "; } cout << endl; return 0; }

输出结果为:

4.deque的访问操作

函数名称功能
operator[]返回指定位置的元素,越界则报错
at返回指定位置的元素,越界则抛异常
front返回字符串第一个元素
back返回字符串最后一个元素

这部分内容和之前学习的vector容器部分内容差不多

int main() { deque<int> d = { 0,1,2,3,4,5,6,7,8,9 }; 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; }

输出结果:

5.deque的修改操作

deque的修改操作有如下几个:

函数名称功能
push_back在数组后追加元素
pop_back删除数组最后一个元素
insert在指定位置追加元素
assign使用指定数组替换原数组
erase删除数组指定部分区间
swap交换两个数组

直接看代码:

尾删和尾插:

输出结果为:

assign和swap:

输出结果为:

insert:

输出结果为:

erase:

输出结果为:

三、deque的应用场景

1.缓存机制:在需要频繁从两端添加或移除元素的场景下,如浏览器历史记录、消息队列等,deque能高效地处理数据。

2.任务调度:在并发编程中,deque可以用于线程池的任务队列,既能快速添加新的任务,也能方便地取出已完成的任务进行后续处理。

3.算法实现:许多排序算法,比如循环队列、滑动窗口算法等,会用到deque来进行辅助存储。

4.游戏开发:游戏中角色的行动序列、回合制系统的牌堆管理等也常使用deque。

5.文本编辑器:滚动条下方的撤销/重做功能,也可以利用deque来存储历史状态。

 

结束语

没啥时间写博客,浅浅水一篇吧~

感谢大佬支持,求点赞收藏评论关注!!!

十分感谢!!!

Read more

【C++---红黑树】在编程的浩瀚星空中,C++犹如一颗璀璨的星辰,以其独有的韵律和节奏,吟唱着智慧与创造的赞歌。它不仅仅是代码的堆砌,更是思维与艺术的交融,引领着无数追梦者,在数字的世界里翩翩起舞。

【C++---红黑树】在编程的浩瀚星空中,C++犹如一颗璀璨的星辰,以其独有的韵律和节奏,吟唱着智慧与创造的赞歌。它不仅仅是代码的堆砌,更是思维与艺术的交融,引领着无数追梦者,在数字的世界里翩翩起舞。

红黑树实现 * 1. 红⿊树的概念 * 1.1红黑树的规则 * 1.2路径问题 * 1.3 红⿊树如何确保最⻓路径不超过最短路径的2倍的? * 1.4 红⿊树的效率 * 2 红⿊树的实现 * 2.1 红黑树大致结构 * 首先:对于颜色来说,我们可以用枚举实现红和黑 * 其次:对于红黑树的结点,需具备以下结构(假设我们用pair<K,V>类型来实现红黑树): * 最后:在实现红黑树的整体结构 * 2.2 红黑树插入 * 2.2.1 红⿊树树插⼊⼀个值的⼤概过程 * 2.2.2

By Ne0inhk
【C++:C++11收尾】解构C++可调用对象:从入门到精通,掌握function包装器与bind适配器包装器详解

【C++:C++11收尾】解构C++可调用对象:从入门到精通,掌握function包装器与bind适配器包装器详解

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 🎬 艾莉丝的C++专栏简介: 文章目录 * C++学习阶段的三个参考文档 * 8 ~> 包装器 * 8.1 function * 8.1.1 结构 * 8.1.2 概念 * 8.1.3 function实现 * 8.1.4 重写逆波兰表达式求值 * 8.2 bind

By Ne0inhk
【C++贪心】P8769 [蓝桥杯 2021 国 C] 巧克力|普及+

【C++贪心】P8769 [蓝桥杯 2021 国 C] 巧克力|普及+

本文涉及知识点 C++贪心 [蓝桥杯 2021 国 C] 巧克力 题目描述 小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。 一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧克力有自己的价格、数量和剩余的保质期天数,小蓝只吃没过保质期的巧克力,请问小蓝最少花多少钱能买到让自己吃 x x x 天的巧克力。 输入格式 输入的第一行包含两个整数 x x x, n n n,分别表示需要吃巧克力的天数和巧克力的种类数。 接下来 n n n 行描述货架上的巧克力,其中第 i i i 行包含三个整数 a i a_i ai , b i b_i bi

By Ne0inhk
C++起始之路——模板进阶

C++起始之路——模板进阶

💁‍♂️个人主页:进击的荆棘 👇作者其它专栏: 《数据结构与算法》《算法》《C++起始之路》 目录 1.非类型模板参数 2.模板的特化 3.模板分离编译 4.模板总结 1.非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或typename之类的后面的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。 namespace Achieve{ //定义一个模板类型的静态数组 tempalte<class T,size_t N=10> class array{ public: T& operator[](size_t index)

By Ne0inhk