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

news2024/12/23 7:53:33

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


文章目录

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


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,3
		deq.push_front(i);
	}
	for (int i = 8; i < 11; i++) {
		//尾部添加8,9,10
		deq.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.coloradmin.cn/o/1583713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国内如何实现GPT升级付款

本来想找国外的朋友代付的&#xff0c;但是他告诉我他的信用卡已经被绑定了他也升级了所以只能自己想办法了。就在一位博主下边发现了这个方法真的可以。只是需要与支付宝验证信息。刚开始不敢付款害怕被骗哈哈&#xff0c;我反诈骗意识绝对杠杠的 该方法就是我们办理一张虚拟…

After Effects 2024 中文激活版 高效工作流程与创新的视觉特效 mac/win

After Effects 2024是Adobe公司推出的一款专业视频特效制作软件&#xff0c;广泛应用于电影、电视、动画等媒体制作领域。它凭借强大的功能和灵活的操作&#xff0c;帮助用户轻松创建电影级影片字幕、片头和过渡效果&#xff0c;以及实现立体效果和动态场景的切换。 同时&#…

Java-接口—知识(基础)

承接上一节&#xff0c;我们讨论了抽象类和抽象方法。 那我们尝试在抽象的道路上走的更远一点&#xff0c;先来总结一下抽象&#xff1b; 抽象类&#xff1a;类中的属性规范了子类必须有什么样的特征&#xff0c;有什么状态。类中的方法规范了子类必须有什么行为&#xff0c;…

【Spring Security】2.实现最简单的身份验证

文章目录 一、找到官网的身份认证&#xff08;authentication&#xff09;示例代码二、实现最简单的身份验证1、创建Spring Boot项目2、创建IndexController3、创建index.html4、启动项目测试Controller 三、{/logout}的作用四、页面样式无法加载的问题 一、找到官网的身份认证…

文本处理常见命令

目录 前言-了解Linux目录结构 一、cat-查看文件内容 1.表现形式 2.常用选项 3.示例 二、more-查看文件内容 1.表现形式 2.交互操作方法 3.示例 三、less-查看文件内容 1.表现形式 2.交互操作方法 四、head-从头查看文件内容 五、tail-从尾查看文件内容 六、wc-统…

设计模式学习笔记 - 设计模式与范式 -行为型:10.迭代器模式(中):遍历集合时,为什么不能增删集合?

概述 上篇文章&#xff0c;我们通过给 ArrayList 和 LinkedList 容器实现迭代器&#xff0c;学习了迭代器模式的原理、实现和设计意图。迭代器模式主要主要是解耦容器代码和遍历代码。 本章&#xff0c;我们来深挖一下&#xff0c;如果在使用迭代器遍历集合的同时增加、删除集…

1999-2022年各省研究与试验发展人员全时当量数据/省研发人员全时当量数据/(RD)人员全时当量(无缺失)

1999-2022年各省研究与试验发展人员全时当量数据/省研发人员全时当量数据/(R&D)人员全时当量&#xff08;无缺失&#xff09; 1、时间&#xff1a;1999-2022年 2、来源&#xff1a;科技年鉴 3、指标&#xff1a;研究与试验发展人员全时当量/研发人员全时当量 4、范围&a…

代码随想录算法训练营Day50|LC123 买卖股票的最佳时机IIILC188 买卖股票的最佳时机IV

一句话总结&#xff1a;虽然是困难题&#xff0c;其实都只需要对122 买卖股票的最佳时机II稍作变形即可。 原题链接&#xff1a;123 买卖股票的最佳时机III 相较于买卖股票的最佳时机和股票II来说&#xff0c;本题加了最多操作两次的限制。那么这里实际上就可以直接用滚动数组…

用C代码实现环形缓冲区(ring buf)

用C代码实现环形缓冲区&#xff08;ring buf&#xff09; 概述环境介绍launch.json(没改&#xff09;tasks.json注意 代码ringbuf.cringbuf.hmain.c 测试说明工程代码下载 概述 因嵌入式项目需要&#xff0c;串口接收的数据有很高的周期性发送频率&#xff0c;原方式通过查询接…

小程序项目思路分享爬虫

小程序项目思路分享爬虫 具体需求&#xff1a; 有这几个就行&#xff0c;门店名称门店地址门店类型&#xff0c;再加上省、市、县/区门店名称&#xff1a;storeName 门店地址&#xff1a;storeAddress 程序运行&#xff1a; honor_spider获取经纬度信息。 经纬度——>详…

Mybatis plus 使用通用枚举

说明&#xff1a;mybatis plus 使用枚举可实现数据库存入时指定值保存&#xff0c; 读取时指定值展示&#xff08;返给前端&#xff09; 可通过继承IEnum<T>、 EnumValue实现 1、引包 <dependency><groupId>mysql</groupId><artifactId>mysql-…

esxi上给centos7虚拟机扩容硬盘

原来centos7硬盘分配的空间只有40GB 需要直接扩容到200GB 扩容前 扩容后 扩容步骤&#xff1a; 1 .在esxi平台上关机虚拟机&#xff0c;将硬盘调整为200GB&#xff0c;然后开机 2.请出chatGPT 1. 创建新分区 使用剩余的磁盘空间创建一个新的分区。你可以使用fdisk&#xf…

归档数据shell脚本

系统中数据很重要&#xff0c;为确保数据不会丢失&#xff0c;定时备份数据是一个必要的习惯。制定一个存储重要文件的数据备份计划也绝非易事&#xff0c;而shell脚本可以祝我们一臂之力。 1.创建需要备份配置文件的路径文件。(BACKUP_FILE) 2.以日期为备份文件的后缀。 3.判断…

LeetCode 热题 100 | 多维动态规划(二)

目录 1 5. 最长回文子串 2 1143. 最长公共子序列 菜鸟做题&#xff0c;语言是 C 1 5. 最长回文子串 核心思想&#xff1a;把总问题拆解为若干子问题。 总问题&#xff1a;从第 i 个字母到第 j 个字母是回文串子问题&#xff1a;从第 i 1 个字母到第 j - 1 个字母是回文…

【就近接入,智能DNS-Geo DNS ,大揭秘!】

做过后端服务或者网络加速的小伙伴&#xff0c;可能或多或少都听说过&#xff0c;智能DNS或者Geo DNS&#xff0c;就是根据用户的位置&#xff0c;返回离用户最近的服务节点&#xff0c;就近接入&#xff0c;以达到服务提速的效果。 那么大家有没想过&#xff0c;这个背后的原理…

ETLCloud结合kafka的数据集成

一、ETLCloud中实时数据集成的使用 在ETLCloud中数据集成有两种方式&#xff0c;一种是离线数据集成&#xff0c;另一种便是我们今天所要介绍的实时数据集成了&#xff0c;两者的区别从名字便可以得知&#xff0c;前者处理的数据是离线的没有时效性的&#xff0c;后者的数据是…

【Keil5-Boot和APP配置】

Keil5-Boot和App配置 ■ Keil5-Boot和APP配置■ 一&#xff1a;sct文件 sct文件配置■ 二&#xff1a;发布版本不需要在 C/C&#xff0c;Asm&#xff0c;Linker&#xff0c;中添加 CMDDEBUG 宏定义。■ 三&#xff1a;Debug版本需要在Linker添加 --pd"-DCMDDEBUG" 才…

4.进程相关 2

8.内存映射 8.1 内存映射相关定义 创建一个文件&#xff0c;将保存在磁盘中的文件映射到内存中&#xff0c;后期两个进程之间对内存中的数据进行操作&#xff0c;大大减少了访问磁盘的时间&#xff0c;也是一种最快的 IPC &#xff0c;因为进程之间可以直接对内存进行存取 8.…

视觉大模型--DeformableDETR

原理大家可以参考这篇文章&#xff0c;我这边主要介绍几个公式和整体源码理解。 提出了多尺度可变形注意力(Multi-scale Deformable Attention, MSDA).基于此设计了 DETR 特有的利用多尺度特征检测的流程&#xff0c;对之后的很多工作有指导意义。提出了两阶段 DETR 的思路&…

OpenHarmony应用开发引入开源C/C++库---之Har包里的NDK

Har 包 HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C 库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。HAR 不同于 HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块…