【C++第三阶段】deque容器评委打分案例

news/2024/5/18 22:52:46/文章来源:https://blog.csdn.net/weixin_44498989/article/details/137613586

以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录

  • 构造函数
  • 赋值操作
  • 大小操作
  • 插入删除
  • 数据存取
  • 排序
  • 评委评分
    • 案例描述


deque容器

双端数组,可以对头端插入删除操作。

如下图所示。

image-20240409203254136

头部有插入删除操作,尾部亦然。有自己迭代器。有获取头部数据和尾部数据方法。

deque与vector区别

  • vector对于头部插入删除效率低,数据量越大,效率越低。
  • deque相对而言,头部插入删除速度比vector快。因为它有自己的中控器,连续存放一部分,再连续存放一部分。
  • vector访问元素速度会比deque快,这和两者内部实现有关。

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

需要说明一点,如果想要在打印容器时不对其修改,可以在入参&创建迭代器时,加上const关键字,使得引用&迭代器是静态的。

代码示例:

void print(const deque<int> &deq){for(deque<int>::const_iterator it = deq.begin() ; it!= deq.end();it++){cout<<*it<<",";}	cout<<endl;cout<<"==========="<<endl;
}

构造函数

以及几种构造函数:

deque<T> deqT;默认构造形式

deque(beg,end);构造函数将迭代器beg-end区间的元素拷贝给本身

deque(n,elem);构造函数将n个elem拷贝给本身

deque(const deque &deq);默认拷贝构造函数

代码示例:

void print(const deque<int>& deq) {for (deque<int>::const_iterator deq_it = deq.begin(); deq_it != deq.end(); deq_it++) {cout << *deq_it << " , ";}cout << endl;cout << "=======" << endl;
}void test0409a() {deque<int> deq;for (int i = 0; i < 3; i++) {deq.push_front(i);deq.push_back(i * i + i);}print(deq);deque<int> deqv2(deq.begin(), deq.end());print(deqv2);deque<int> deqv3(3, 5);print(deqv3);deque<int> deqv4(deqv2);print(deqv4);
}

运行结果:

image-20240409211302523

赋值操作

三种方式

deque& operator=(const deque &deq);直接另一个容器等于,相当于重载等号操作符

assign(beg,end);将迭代器中的区间拷贝给本身。

assign(n,elem);将n个elem拷贝赋值给本身。

代码示例:

void print(const deque<int>& deq) {for (deque<int>::const_iterator deq_it = deq.begin(); deq_it != deq.end(); deq_it++) {cout << *deq_it << " , ";}cout << endl;cout << "=======" << endl;
}
void test0409b() {deque<int> deq;for (int i = 2; i < 9; i += 2) {deq.push_front( i * i - 2*i);}deque<int> deqv2 = deq;print(deqv2);deque<int> deqv3(deqv2.begin(), deqv2.end());print(deqv3);deque<int> deqv4(3, 5);print(deqv4);}

运行结果:

image-20240409212540527

大小操作

有四种,列表格查看。

目的函数
判断容器是否为空deque.empty();
容器内元素个数deque.size();
重新赋个数,如果超出,则截断,如果没超出,则默认值填充。deque.resize(num);
重新赋个数,如果超出,则截断,如果每超出,则elem值填充。deque.resize(num , elem);

代码示例

void print(const deque<int>& deq) {for (deque<int>::const_iterator deq_it = deq.begin(); deq_it != deq.end(); deq_it++) {cout << *deq_it << " , ";}cout << endl;cout << "=======" << endl;
}void test0409c() {deque<int> deq;for (int i = 1; i < 5; i++) {deq.push_front(i * i + i * 2 - 5);}print(deq);cout << "容器个数是否为空?1为true,0为false" << deq.empty()<<" . " << endl;cout << "容器内元素个数:" << deq.size() << " . " << endl;deq.resize(4);print(deq);deq.resize(5, 2);print(deq);
}

运行结果:

image-20240409213336460

插入删除

插入操作:

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

指定位置插入:

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

删除操作:

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

示例代码:

void print(const deque<int>& deq) {for (deque<int>::const_iterator deq_it = deq.begin(); deq_it != deq.end(); deq_it++) {cout << *deq_it << " , ";}cout << endl;cout << "=======" << endl;
}
void test0410a() {deque<int> deq;for (int i = 0; i < 3; i++) {//头部插入3个数据1,2,3deq.push_front(i);}for (int i = 8; i < 11; i++) {//尾部添加8,9,10deq.push_back(i);}//打印当前deque容器。print(deq);//删除容器最后一个数据deq.pop_back();cout << "删除最后一个数据后的容器为" << endl;print(deq);//删除容器第一个数据deq.pop_front();cout << "删除第一个数据的容器为:" << endl;print(deq);//在第1个位置插入一个数据elem//这里的位置是迭代器。deq.insert(deq.begin(), 2);cout << "在头部插入一个2后,容器为" << endl;print(deq);deq.insert(deq.end(),2, 100);cout << "在尾部插入2个100后,容器为" << endl;print(deq);deq.insert(deq.begin(), --deq.end(), deq.end());cout << "在头部插入当前数据的最后一个元素" << endl;print(deq);deq.erase(deq.begin(), ++deq.begin());cout << "删除第一个元素后,容器为" << endl;print(deq);deq.erase(deq.begin());cout << "删除最后一个元素,容器为" << endl;print(deq);deq.clear();cout << "当前容器是否为空?1为空,0为否" << endl;cout << deq.empty() << endl;}

运行结果:

image-20240410204139416

erase不能直接删除最后一个元素,询问GPT结果:

因为end()指向的是下一个元素。

您的代码尝试使用deq.erase(deq.end());来删除deque的最后一个元素,但这会导致未定义行为并可能引发运行时错误。原因是deq.end()返回的迭代器指向容器末尾元素之后的位置,而不是最后一个元素本身。这意味着您试图从一个非法位置删除元素,因为.end()返回的迭代器并不指向有效的容器元素。

正确的做法是使用deq.erase(deq.end() - 1);来删除最后一个元素。不过,对于std::deque来说,这个表达式也是错误的,因为std::deque不支持随机访问迭代器的减法操作。对于std::deque,正确删除最后一个元素的方法是使用deq.pop_back();,这是专门用来移除容器尾部元素的成员函数。

数据存取

对deque的数据进行存取。这里的索引是索引,不是序号。

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

代码示例:

void print(const deque<int>& deq) {for (deque<int>::const_iterator deq_it = deq.begin(); deq_it != deq.end(); deq_it++) {cout << *deq_it << " , ";}cout << endl;cout << "=======" << endl;
}
void test0410b() {deque<int> deq;for (int i = 0; i < 5; i++) {deq.push_back(i*i - 2 );}print(deq);cout << "第3个数据是:" << deq.at(2) << "." << endl;cout << "第4个数据是:" << deq[3] << endl;cout << "第一个数据是:" << deq.front() << "." << endl;cout << "最后一个数据是:" << deq.back() << "." << endl;
}

运行结果:

image-20240410205709698

排序

系统自带的算法,排序。要包含algorithm头文件。

示例代码:

void print(const deque<int>& deq) {for (deque<int>::const_iterator deq_it = deq.begin(); deq_it != deq.end(); deq_it++) {cout << *deq_it << " , ";}cout << endl;cout << "=======" << endl;
}
void test0410c() {deque<int> deq;for (int i = -3; i < 4; i++) {deq.push_back(i*i+2*i-3);}print(deq);sort(deq.begin(), deq.end());cout << "排序后" << endl;print(deq);
}

运行结果:

image-20240410210236989

对于支持随机访问的迭代器的容器,可以利用sort算法直接对其排序。

评委评分

案例描述

5名选手,10个评委分别对一名选手打分,去除最高分,去除最低分,获取平均分。

示例代码:

class Member {public:Member() {}Member(string name, int number) {this->member_name = name;this->set_score_number(number);}public:vector<int> score;int final_score;string member_name;private:int score_number ;public:void set_score_number(int number) {this->score_number = number;}int get_score_number() {return this->score_number;}int get_final_score() {for (int i = 0; i < score_number; i++) {final_score += score[i];}if (score_number == 2) {final_score = final_score / 2;}else if(score_number == 1) {return final_score;}else {score.pop_back();score.erase(score.begin());return final_score/score_number;}this->final_score = final_score;return final_score;}
};void test0410d() {int eval_number;cout << "请输入评委人数:";bool eval_bool = true;while (eval_bool) {cin >> eval_number;if (eval_bool >= 0) {eval_bool = false;}else {cout << "请输入评委人数(>=0):";}}cout << endl;int single_number;cout << "请输入参赛人员人数:";bool single_bool = true;while (single_bool) {cin >> single_number;if (single_number >= 0) {single_bool = false;}else {cout << "请输入参赛人员人数(>=0):";}}cout << endl;vector<Member> vec_Members;for (int i = 0; i < single_number; i++) {cout << "请输入参赛人员姓名:";string temp_name;cin >> temp_name;Member temp(temp_name, eval_number);vec_Members.push_back(temp);//vec_Members[i].member_name = temp_name;//vec_Members[i].set_score_number(eval_number);//cout << endl;}cout << endl;vector<int> member_scores;for (vector<Member>::iterator mem = vec_Members.begin(); mem != vec_Members.end(); mem++){cout << "当前参赛人员为:" << (*mem).member_name << "."<<endl;for (int i = 0; i < eval_number; i++) {int temp_score;cout << "请输入第" << i + 1 << "个评委的打分:";cin >> temp_score;(*mem).score.push_back(temp_score);}(*mem).final_score = (*mem).get_final_score();//cout << "当前参赛人员" << (*mem).member_name << "得分为:" << (*mem).final_score << endl;member_scores.push_back((*mem).final_score);cout << endl;}cout << endl;for (int i = 0; i < member_scores.size();i++) {cout << "当前选手" << vec_Members[i].member_name << "得分为\t" << member_scores[i] << "." << endl;}sort(member_scores.begin(),member_scores.end());float max_score = member_scores[member_scores.size()-1];cout << endl;cout << "比赛最高分为:" << max_score << endl;cout << endl;for (int i = 0; i < single_number; i++) {//cout << vec_Members[i].member_name << "得分为:" << vec_Members[i].final_score << "."<<endl;if (vec_Members[i].final_score == max_score) {cout<<"得分最高的选手为:"<<vec_Members[i].member_name<<"."<<endl;}}
}

运行截图:

image-20240410221645647


以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了

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

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

相关文章

three.js尝试渲染gbl模型成功!(三)

参照教程&#xff1a;https://cloud.tencent.com/developer/article/2276766?areaSource102001.5&traceId88k805RaN_gYngNdKvALJ &#xff08;作者&#xff1a;九仞山&#xff09; 通过最近两天查three.js入门教程了解到 这玩应支持包括 .obj、.gltf等类型的模型结构。 g…

【微服务】------服务注册

在 微服务的基建工作 中提到过&#xff0c;在云原生、微服务时代&#xff0c;如果还是手动修改服务地址&#xff0c;是几乎不可完成的工作&#xff0c;需要一种机制完成自动上报和获取服务地址的支撑组件&#xff0c;可以保障服务的快速上线和下线&#xff0c;这就是服务注册/发…

vue vue3 手写 动态加载组件

效果展示 一、需求背景&#xff1a; # vue3 项目涉及很多图表加载、表格加载 #考虑手写一个动态加载组件 二、实现思路 通过一个加载状态变量&#xff0c;通过v-if判断&#xff0c;加载状态的变量等于哪一个&#xff0c;动态加载组件内部就显示的哪一块组件。 三、实现效果…

酷开科技 |酷开系统全视频化升级,让电视回归视频属性

随着消费升级浪潮的兴起&#xff0c;家庭互联网这一概念也在资本的注入下&#xff0c;成为了新风口。酷开系统全视频化升级&#xff0c;让电视回归视频属性&#xff0c;酷开系统在之前瀑布流板块设计的基础上&#xff0c;增加了视频流图文融合的并行界面&#xff0c;同时酷开系…

AWS入门实践-利用S3构建一个静态网站

使用Amazon S3托管静态网站是一个流行的选择&#xff0c;因为它简单、成本效益高&#xff0c;并且易于维护。静态网站由不含服务器端脚本的文件组成&#xff0c;如HTML、CSS和JavaScript文件。下面是使用S3托管静态网站的操作步骤&#xff1a; 如果大家没有AWS免费账号&#x…

外包干了15天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

ITK 重采样 resample

Itk 重新采样有二多种情况&#xff0c;这里说二种情况 1. 输入参数 &#xff0c;和输出相关数据&#xff0c;输出范围&#xff0c;spacing &#xff1b; typedef itk::Image< float, 3 > itkFloatImageType;typedef itk::ResampleImageFilter < itkFloatImageType, i…

数字化智慧养老:引领老年人融入科技时代新生活

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 人类社会已经步入了一个全新的数字时代。在这个时代&#xff0c;互联网、大数据、人工智…

搭建前后端的链接(java)

搭建前后端的链接(java) 一.前提 1.1 javaEE 搭建前后端的链接首先需要用到javaEE&#xff0c;也就是java企业版&#xff0c;也就是java后端(后端javaSE) 利用javaEE和前端交互&#xff0c;javaSE和数据库交互&#xff0c;javaSE和javaEE之间再进行交互就实现了前后端的交互…

“卷生卷死”的消费电子ODM,如何用数据建设缩短交期?奇点云供应链控制塔实践

消费电子制造是一个充分竞争的行业。 哪怕对于已位居全球龙头的ODM厂商&#xff08;原始设计制造商&#xff09;而言&#xff0c;在既卷质量又卷价格还卷创新的市场始终保持领先&#xff0c;也从不简单。 以本文分享的企业为例&#xff0c;企业A是领先的智能硬件ODM厂商&…

scRAN-seq|加权最近邻分析(2)

概述 本文[1]介绍了Seurat 5.0.0中的加权最近邻&#xff08;WNN&#xff09;分析方法&#xff0c;这是一种用于整合和分析多模态单细胞数据的无监督框架。 简介 多模态分析作为单细胞基因组学的一个新兴领域&#xff0c;它通过同时测量多种数据类型来精确描绘细胞状态&#xff…

掼蛋的六讲原则

第一讲&#xff1a;与同事玩掼蛋&#xff0c;讲娱乐 同事可以说是现在的人们见得最多的一批人&#xff0c;所以与同事打好关系是十分有必要的&#xff0c;所以在和同事玩掼蛋的时候&#xff0c;我们主要讲究的是娱乐精神&#xff0c;大家一起开开心心玩&#xff0c;工作也能变得…

Docker快速上手及常用命令速查

Docker快速上手 安装 在ubuntu上安装docker: sudo apt-get install docker docker -v #查看版本在centos7上安装docker&#xff1a;(docker在YUM源的Extras仓库中) yum install docker systemctl start dockerdocker常用命令速查 #查看docker信息 docker info #查看本地镜…

SpringBoot及其特性

0.前言 Spring 框架提供了很多现成的功能。那么什么是 Spring Boot&#xff1f;使用 Spring 框架&#xff0c;我们可以避免编写基础框架并快速开发应用程序。为了让 Spring 框架提供基础框架&#xff0c;我们需要向 Spring 框架描述有关我们的应用程序及其组件的信息。 不只是…

面试记录(三)

面了57min&#xff0c;实在问麻了&#xff0c;下面的问题就没有按顺序记录了&#xff1a; 1.linux熟悉吗&#xff1a;熟悉基础的环境变量、目录等用法&#xff0c;问如何查找一个文件&#xff08;不会&#xff0c;又追问如何设计一个c的程序去查找&#xff1a;先找文件类型&am…

java基础语法(12)| 异常

1. 异常 1.1 什么是异常 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象或抛出了一个异常对象。Java处理异…

万界星空科技生产工时管理系统

生产工时管理系统是一个管理系统&#xff0c;生产管理人员可以详细地、逐项活动地查看生产和即时劳动力数据&#xff0c;特别是活动级劳动力信息&#xff0c;辅助生产管理人员利用从车间获得的效率数据&#xff0c;实时监控生产流程&#xff0c;并在提高生产率&#xff0c;控制…

C++的并发世界(十一)——线程池

0.线程池的概念 1.线程池使用步骤 ①初始化线程池&#xff1a;确定线程数量&#xff0c;并做好互斥访问&#xff1b; ②启动所有线程 ③准备好任务处理基类&#xff1b; ④获取任务接口&#xff1a;通过条件变量阻塞等待任务 2.atomic原子操作 std:atomic是C11标准库中的一个…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发actions…