06.deque 容器

6、deque 容器

功能:

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

deque 与 vector 区别:

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

1694769371847

deque 内部工作原理:

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

1694769676034

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

6.1 deque构造函数

功能描述:

  • deque 容器构造

函数原型:

deque<T>deqT;			// 默认构造形式
deque(beg, end);		// 构造函数将 [beg, end) 区间中的元素拷贝给本身。
deque(n, elem);			// 构造函数将 n 个 elem 拷贝给本身
deque(const deque &deq);// 拷贝构造函数
#include <iostream>
#include <deque>
using namespace std;
void printDeque(const deque<int>& d) {for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) {cout << *it << " ";}cout << endl;
}void test01() {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);
}int main() {test01();system("pause");return 0;
}

总结:

  • deque 容器和 vector 容器的构造方式几乎一致,灵活使用即可

6.2 deque 赋值操作

功能描述:

  • 给 deque 容器进行赋值

函数原型:

deque& operator=(const deque &deq);		// 重载等号操作符
assign(beg, end);						// 将 [beg, end) 区间中的数据拷贝赋值给本身。
assign(n, elem);						// 将 n 个 elem 拷贝赋值给本身。
#include <iostream>
#include <deque>
using namespace std;void printDeque(const deque<int>& d) {for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) {cout << *it << " ";}cout << endl;
}//赋值操作
void test01() {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);
}int main() {test01();system("pause");return 0;
}

6.3 deque 大小操作

功能描述:

  • 对 deque 容器的大小进行操作

函数原型:

deque.empty();		// 判断容器是否为空
deque.size();		// 返回容器中元素的个数// 重新指定容器的长度为 num,若容器变长,则以默认值填充新位
// 如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num);// 重新指定容器的长度为 num,若容器变长,则以 elem 值填充新位置。
// 如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem);
#include <iostream>
#include <deque>
using namespace std;void printDeque(deque<int> &d) {for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) {cout << *it << " ";}cout << endl;
}void test01() {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);
}int main() {test01();system("pause");return 0;
}

总结:

  • deque 没有容量的概念
  • 判断是否为空 — empty
  • 返回元素个数 — size
  • 重新指定个数 — resize

6.4 deque 插入和删除

功能描述:

  • 向 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 位置的数据,返回下一个数据的位置。
#include <iostream>
#include <deque>
using namespace std;void printDeque(const deque<int>& d) {for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) {cout << *it << " ";}cout << endl;
}// 两端操作
void test01() {deque<int> d;// 尾插d.push_back(10);d.push_back(20);// 头插d.push_front(100);d.push_front(200);printDeque(d);// 尾插d.pop_back();d.pop_front();printDeque(d);
}//插入
void test02() {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);
}void test03() {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);
}int main() {//test01();//test02();test03();system("pause");return 0;
}

总结:

  • 插入和删除提供的位置是迭代器!
  • 尾插 — push_back
  • 尾删 — pop_back
  • 头插 — push_front
  • 头删 — pop_front

6.5 deque数据存取

功能描述:

  • 对 deque 中的数据的存取操作

函数原型:

at(int idx); //返回索引 idx 所指的数据
operator[];  //返回索引 idx 所指的数据
front();	 //返回容器中第一个数据元素
back();		 //返回容器中最后一个数据元素
#include <iostream>
#include <deque>
using namespace std;void printDeque(deque<int> &d) {for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) {cout << *it << " ";}cout << endl;
}void test01() {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;
}int main() {test01();system("pause");return 0;
}

总结:

  • 除了用迭代器获取 deque 容器中元素,[ ] 和 at 也可以
  • front 返回容器第一个元素
  • back 返回容器最后一个元素

6.6 deque 排序

功能描述:

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

算法:

sort(iterator beg,iterator end);// 对 beg 和 end 区间内元素进行排序
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;void printDeque(const deque<int> &d) {for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) {cout << *it << " ";}cout << endl;
}void test01() {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);
}int main() {test01();system("pause");return 0;
}

总结:

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

6.7 案例——评委打分

有5名选手:选手 ABCDE,10 个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。

实现步骤:

  1. 创建五名选手,放到 vector 中
  2. 遍历 vector 容器,取出来每一个选手,执行 for 循环,可以把 10 个评分打分存到 deque 容器中
  3. sort 算法对 deque 容器中分数排序,去除最高和最低分
  4. deque 容器遍历一遍,累加总分
  5. 获取平均分
#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;class Person {
public:Person(string name, int num) {this->m_name = name;this->m_num = num;}
public:string m_name;int m_num;
};// 创建人数
void createPerson(vector<Person>& v) {string nameSeed = "ABCDE";for (int i = 0; i < 5; ++i) {string name = "选手";name += nameSeed[i];int num = 0;Person p(name, num);// 将创建的Person对象 放入到容器中v.push_back(p);}
}void setScore(vector<Person>& v) {for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {// 将评委的分数 放入到deque容器中deque<int> d;for (int i = 0; i < 10; ++i) {int score = rand() % 41 + 60;//60 ~ 100d.push_back(score);}// 测试/*cout << "选手:" << it->m_name << " 打分:" << it->m_num << endl;for (deque<int>::iterator dit = d.begin(); dit != d.end(); ++dit) {cout << *dit << " ";}cout << endl;cout << "-------------------------------------------------" << endl;*/// 排序sort(d.begin(), d.end());// 取出最高分和最低分d.pop_back();d.pop_front();// 取平均分int sum = 0;for (deque<int>::iterator dit = d.begin(); dit != d.end(); ++dit) {sum += *dit;}int avg = sum / d.size();// 将平均分 赋值给选手身上it->m_num = avg;}
}void showScore(vector<Person>& v) {for (vector<Person>::iterator it = v.begin(); it != v.end(); ++it) {cout << "姓名:" << it->m_name << " 平均分:" << it->m_num << endl;}/*cout << "-------------------------------------------------" << endl;*/
}int main() {srand((unsigned int)time(NULL));// 1、创建5名选手vector<Person> v;// 存放选手的容器createPerson(v);// 测试/*for (vector<Person>::iterator it = v.begin(); it != v.end(); ++it) {cout << "姓名:" << (*it).m_name << " 分数:" << (*it).m_num << endl;}cout << "-------------------------------------------------" << endl;*/// 2、给5名选手打分setScore(v);// 3、显示最后得分showScore(v);system("pause");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中itertools 模块的用法

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 在 Python 中&#xff0c;迭代器是一种非常好用的数据结构&#xff0c;其最大的优势就是延迟生成&#xff0c;按需使用&#xff0c;从而大大提高程序的运行效率。 而 itertools 作为 Python 的内置模块&#xff0c;就为我们提…

【AIGC重塑教育】AI大模型驱动的教育变革与实践

文章目录 &#x1f354;现状&#x1f6f8;解决方法✨为什么要使用ai&#x1f386;彩蛋 &#x1f354;现状 AI正迅猛地改变着我们的生活。根据高盛发布的一份报告&#xff0c;AI有可能取代3亿个全职工作岗位&#xff0c;影响全球18%的工作岗位。在欧美&#xff0c;或许四分之一…

js输入框部分内容不可编辑,其余正常输入,el-input和el-select输入框和多个下拉框联动后的内容不可修改

<tr>//格式// required自定义指令<e-td :required"!read" label><span>地区&#xff1a;</span></e-td><td>//v-if"!read && this.data.nationCode 148"显示逻辑<divclass"table-cell-flex"sty…

Python3中_和__的用途和区别

目录 一、_&#xff08;下划线&#xff09; 1、临时变量&#xff1a; 2、未使用的变量&#xff1a; 二、__&#xff08;双下划线&#xff09; 1、私有属性&#xff1a; 2、私有方法&#xff1a; 三、__的一些特殊用途。 总结 Python3中的_和__是两个特殊的标识符&#…

羊大师讲解,羊奶中的干物质

羊大师讲解&#xff0c;羊奶中的干物质 羊奶作为一种营养价值极高的乳制品&#xff0c;其中的干物质含量是其重要组成成分之一。干物质是指在牛奶中除去水分后剩余的成分&#xff0c;包括蛋白质、脂肪、乳糖、矿物质和维生素等。这些干物质不仅赋予了羊奶独特的口感和营养价值…

1U、2U、4U和42U服务器,看完秒懂!

晚上好&#xff0c;我的网工朋友。 服务器是一个很广泛的概念&#xff0c;涵盖了各种类型和规格的计算机&#xff0c;用于提供各种网络和数据服务。 而机架服务器是当前数据中心和专业计算环境中&#xff0c;使用最为广泛的服务器类型之一。 机架式服务器的外形看来不像计算…

Spring Cloud Alibaba核心技术宝典,分布式系统中间件实战案例(百度云下载)

前言 《Spring Cloud Alibaba学习笔记》其实是阿里的微服务解决方案&#xff0c;是阿里巴巴结合自身微服务实践,开源的微服务全家桶&#xff0c;在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如&#xff1a;Eureak,zuul等。…

05-Autoscaling

1 Knative的自动缩放机制 “请求驱动计算”是serverless的核心特性 缩容至0&#xff1a;即没有请求时&#xff0c;系统不会分配资源给Kservice&#xff1b;从0开始扩容&#xff1a;由Activator缓存请求&#xff0c;并报告指标数据给Autoscaler&#xff1b;按需扩容&#xff1a;…

说一下 jvm 有哪些垃圾回收算法?

说一下 jvm 有哪些垃圾回收算法&#xff1f; 一.对象是否已死算法 1.引用计数器算法 2.可达性分析算法 二.GC算法 1.标记清除算法 如果对象被标记后进行清除&#xff0c;会带来一个新的问题–内存碎片化。如果下次有比较大的对象实例需要在堆上分配较大的内存空间时&#xff0…

【Axure高保真原型】3D商品销售可视化模板

今天和大家分享3D商品销售大屏可视化的原型模板&#xff0c;里面包括常用的3D条形图、3D柱状图、3D饼图、3D环形图、3D金字塔图&#xff0c;鼠标移入图表&#xff0c;对应区域会高亮变色&#xff0c;并且显示对应的数据标签&#xff0c;鼠标移入地图标点后&#xff0c;可以显示…

2023 OADC:开放原子云社区正式启航,Curve、Kyuubi获奖

12月16-17日&#xff0c;2023开放原子开发者大会&#xff08;OADC&#xff09;在江苏省无锡市召开。大会首日&#xff0c;由网易数帆联合发起的“开放原子云社区”宣告成立&#xff0c;随后网易数帆资深云原生专家侯诗军分享了稳定性保障的前沿实践&#xff0c;Curve、Apache K…

每天五分钟计算机视觉:网络中的网络(NiN)

本文重点 前面的课程中我们学习了众多的经典网络模型&#xff0c;比如LeNet、AlexNet、VGG等等&#xff0c;这些网络模型都有共同的特点。 它们的特点是&#xff1a;先由卷积层构成的模块充分提取空间特征&#xff0c;然后再由全连接层构成的模块来输出分类结果。也就是说它们…