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

2024-04-11 01:04

本文主要是介绍【C++第三阶段】deque容器评委打分案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


文章目录

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


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


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

学吧,学无止境,太深了

这篇关于【C++第三阶段】deque容器评委打分案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892661

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。