Day09 C++STL入门基础知识六——deque容器 构造函数-赋值操作-大小操作-插入删除-数据存储-排序操作【全面深度剖析+例题代码展示】
创始人
2024-05-19 09:58:11
0

无人问津的日子,我为自己喝彩!

文章目录

  • 1. 基本概念
    • 1.1 功能
    • 1.2 与`vector`区别
    • 1.3 图解
    • 1.4 内部工作原理
    • 1.5 `deque` 容器的迭代器也是支持随机访问的
  • 2. 构造函数
    • 2.1 函数原型
    • 2.2 代码展示
    • 2.3 测试结果
    • 2.4 小think
      • 2.4.1 小问题
      • 2.4.2 思路
      • 2.4.3 修改
      • 2.4.4 测试
  • 3. 赋值操作
    • 3.1 函数原型
      • 3.2 代码展示
      • 3.3 测试结果
  • 4. 大小操作
    • 4.1 函数原型
    • 4.2 代码展示
    • 4.3 测试结果
  • 5. 插入操作
    • 5.1 两端插入操作
      • 5.1.1 函数原型
      • 5.1.2 代码展示
      • 5.1.3 测试结果
    • 5.2 指定位置操作
      • 5.2.1 函数原型
    • 5.2.2 代码展示
      • 5.2.3 测试结果
  • 6. 删除操作
    • 6.1 函数原型
    • 6.2 代码展示
    • 6.3 测试结果
  • 7. 数据存取操作
    • 7.1 函数原型
    • 7.2 代码展示
    • 7.3 测试结果
  • 8. 排序操作
    • 8.1 sort算法
    • 8.2 代码展示
    • 8.3 测试结果
  • 9. 明日计划
  • 10. 感谢大家支持!!!😉😉😉

1. 基本概念

1.1 功能

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

1.2 与vector区别

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

1.3 图解

在这里插入图片描述

1.4 内部工作原理

  • deque内部有一个中控器维护每段缓冲区中的内容缓冲区中存放真实的数据
  • 中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
    在这里插入图片描述
    在这里插入图片描述

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

2. 构造函数

2.1 函数原型

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

2.2 代码展示

#include
#include
#include
using namespace std;void printDeque(const deque d) { //遍历打印输出for (deque::const_iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
void text01() {deque d1;for (int i = 0; i < 10; i++) {d1.push_back(i);}cout << "d1=";printDeque(d1);//构造函数将d1元素拷贝给d2dequed2(d1.begin(),d1.end());cout << "d2=";printDeque(d2);dequed3(10, 3);cout << "d3=";printDeque(d3);dequed4(d3);cout << "d4=";printDeque(d4);}int main() {text01();return 0;
}

2.3 测试结果

在这里插入图片描述

2.4 小think

2.4.1 小问题

我们知道,迭代器可以对容器中的数据进行读写操作,通过迭代器it我们可以读取容器中的元素,但可能不经意之间也会对其修改。但如何才能只读取并避免进行修改呢???

2.4.2 思路

  1. 当我们用const限制传入的deque的地址时,会发现报错了捏——不存在……的转换
    在这里插入图片描述
  2. 此时我们分析报错内容,大概就是不存在const_iterator到iterator的转换,也就是传入时的迭代器就是const只能读取不能修改的,所以使用时也应是只读迭代器,而不是普通的迭代器。
    在这里插入图片描述

2.4.3 修改

当我们把迭代器改为只读迭代器时,发现不再报错了欸
在这里插入图片描述

2.4.4 测试

当我们尝试用迭代器对数据进行修改时,发现报错了——表达式必须是可修改的左值,也就是该迭代器访问数据时,只能读取,不能修改,我们的目的达到了!!
在这里插入图片描述

3. 赋值操作

鉴于dequevector的赋值操作基本类似,本篇就不详细讲了,带着大家敲击行代码就好了,详细内容请见👉👉👉 Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】eiO

3.1 函数原型

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

3.2 代码展示

#include
#include
#include
using namespace std;void printDeque(const deque d) { //遍历打印输出for (deque::const_iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
void text02() {dequed1;for (int i = 0; i < 10; i++) {d1.push_back(i);}//=赋值dequed2;d2 = d1;cout << "d2=";printDeque(d2);//assign赋值dequed3;d3.assign(d1.begin() + 2, d1.end());cout << "d3=";printDeque(d3);//n个ele赋值dequed4;d4.assign(10, 4);cout << "d4=";printDeque(d4);}int main() {//text01();text02();return 0;
}

3.3 测试结果

在这里插入图片描述

4. 大小操作

4.1 函数原型

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

vecor不同,deque双端数组,所以可以在头尾两端无限插入读取数据,所以就没有固定的容量

4.2 代码展示

#include
#include
#include
using namespace std;void printDeque(const deque d) { //遍历打印输出for (deque::const_iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
//deque容器大小操作
void text03() {deque d1;for (int i = 0; i < 10; i++) {d1.push_back(i);}printDeque(d1);//判空if (d1.empty())cout << "d1为空" << endl;elsecout << "d1为非空" << endl;//大小int size = d1.size();cout << "d1的大小为:" << size << endl;//重新指定大小【扩大】d1.resize(15);cout << "个数扩大为15时:";printDeque(d1);//重载指定大小d1.resize(20, 123);cout << "重载扩大为20时:";printDeque(d1);//重新指定大小【缩小】d1.resize(8);cout << "缩小为8时:";printDeque(d1);
}int main() {//text01();//text02();text03();return 0;
}

4.3 测试结果

在这里插入图片描述

5. 插入操作

5.1 两端插入操作

5.1.1 函数原型

  • push_back(elem) 在容器尾部添加一个数据
  • push_front(elem); 在容器头部插入一个数据
  • pop_back(); 删除容器最后一个数据
  • pop_front(); 删除容器第一个数据

5.1.2 代码展示

#include
#include
#include
using namespace std;void printDeque(const deque d) { //遍历打印输出for (deque::const_iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
void text04() {dequed1;//尾插d1.push_back(10);d1.push_back(20);d1.push_back(30);	printDeque(d1);  //10 20 30//头插d1.push_front(5);d1.push_front(0);printDeque(d1);  //0 5  10 20 30 //尾删d1.pop_back();  printDeque(d1);  // 0  5  10  20   //头删d1.pop_front();printDeque(d1);  //5  10  20
}int main(){text04();return 0;
}

5.1.3 测试结果

在这里插入图片描述

5.2 指定位置操作

5.2.1 函数原型

  • insert(pos,elem); 在pos位置插入一个elem元素拷贝,返回新数据的位置
  • insert(pos, n, elem); 在pos位置插入n个elem数据,无返回值
  • insert(pos, beg, end); 在pos位置插入[beg, end)区间的数据,无返回值

5.2.2 代码展示

#include
#include
#include
using namespace std;void printDeque(const deque d) { //遍历打印输出for (deque::const_iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
void text05() {deque d1;d1.push_back(10);d1.push_back(20);d1.push_front(100);d1.push_front(200);printDeque(d1);//200 100 20 10//insert插入d1.insert(d1.begin(), 400);printDeque(d1);//insert重载d1.insert(d1.begin(), 2, 600);printDeque(d1);//insert区间插入dequed2;d2.push_back(1);d2.push_back(2);d2.push_back(3);d1.insert(d1.begin(), d2.begin(), d2.end());printDeque(d1);}
int main(){text05();return 0;
}

5.2.3 测试结果

在这里插入图片描述

6. 删除操作

6.1 函数原型

  • clear(); 清空容器所有数据
  • erase(beg, end); 删除[beg,end)区间的数据,返回下一个数据的位置
  • erase(pos); 删除pos位置的数据,返回下一个数据的位置

6.2 代码展示

#include
#include
#include
using namespace std;void printDeque(const deque d) { //遍历打印输出for (deque::const_iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
//删除
void text06() {deque d1;for (int i = 0; i < 10; i++) {d1.push_back(i);}printDeque(d1);//头尾删d1.pop_front();printDeque(d1);d1.pop_back();printDeque(d1);//迭代器删除指定位置  it+=posdeque::iterator it = d1.begin();it++;d1.erase(it);printDeque(d1);//按照区间的方式删除d1.erase(it , d1.end()-2);printDeque(d1);//清空cout << "使用clear()清空为:";d1.clear();printDeque(d1);for (int i = 0; i < 10; i++) {d1.push_back(i);}printDeque(d1);d1.erase(d1.begin(), d1.end());cout << "使用erase()清空为:";printDeque(d1);
}int main(){text06();return 0;
}

6.3 测试结果

在这里插入图片描述

7. 数据存取操作

7.1 函数原型

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

7.2 代码展示

#include
#include
#include
using namespace std;void printDeque(const deque d) { //遍历打印输出for (deque::const_iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
//数据存取
void text07() {dequed1;for (int i = 0; i < 10; i++) {d1.push_back(i);}d1.push_back(20);d1.push_back(30);d1.push_front(100);d1.push_front(200);int len = d1.size();//通过[ ]访问for (int i = 0; i < len; i++) {cout << d1[i] << " ";}cout << endl;//通过at方式访问for (int i = 0; i < len; i++) {cout << d1.at(i) << " ";}cout << endl;//访问头尾元素cout << "头元素为:" << d1.front() << endl;cout << "尾元素为:" << d1.back() << endl;}
int main(){text07();return 0;
}

7.3 测试结果

在这里插入图片描述

8. 排序操作

8.1 sort算法

  • sort(iterator beg, iterator end); 对beg和end区间元素进行排序
  • 包含头文件#include
  • 默认从小到大排【关于如何从大到小和如何自定义我们后面会讲到!!】
  • 对于支持随机访问的迭代器的容器,都可以利用sort算法直接进行排序

8.2 代码展示

#include
#include
#include
#include
using namespace std;void printDeque(const deque d) { //遍历打印输出for (deque::const_iterator it = d.begin(); it != d.end(); it++) {cout << (*it) << " ";}cout << endl;
}
void text08() {deque d1;d1.push_back(100);d1.push_back(60);d1.push_back(90);d1.push_front(200);d1.push_front(10);d1.push_front(300);cout << "排序前:";printDeque(d1);//排序deque::iterator it = d1.begin();int size = d1.size();sort(it, it + size);//或者sort(d1.begin(),d1.end());cout << "排序后:";printDeque(d1);
}
int main(){text08();return 0;
}

8.3 测试结果

在这里插入图片描述

9. 明日计划

  • 线代第一章提高题+三1
  • 蓝桥杯*5
  • STL stack+queue容器
  • 高代七1、2

10. 感谢大家支持!!!😉😉😉

上一篇:C++ 模板

下一篇:【Maven】聚合与继承

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...