【C++】set的使用。(样例:学生成绩排序)

2024/1/1更新

set是升序容器,因此可以使用它来静态排序数据。
但个人建议使用数据库而不是造这不顶用的轮子(除非刷题),而且set排序在实际应用也并不怎么出众(单是它的排序优先级自创建后就不可改的低灵活性就已经很糟糕了

旧内容已过时

下面的东西不用看了,看了浪费时间。(不想改单纯是因为已经打算不用CSDN了,因此文章内容不再维护





前段时间使用了set,了解到了set具有排序功能,然后碰巧我那作业得使用排序来减少算法复杂度,就随手做个样例试用下set。
结果这个样例写着写着就上头(写了几小时)。个人觉得自己写的样例完成度还算挺高,拿来水一下。

先提一句,插入数据后再修改多级排序的话是不会对已插入的数据进行排序的,这请注意一下。如果多级排序发生改变的话就只能再重新生成一次set,如果排序频繁变动的话就建议别使用这个方式进行排序了,反复生成set要的开销也不小。


【代码运行结果(按总分→语文→英语→数学的顺序排序)】
代码运行结果




这里为了规范,就设置了多个文件,文件有5个,为“main.cpp”、“XJ_Student.h”、“XJ_Student.cpp”、“XJ_Random.h”、“XJ_Random.cpp”。先简单说一下怎么看多文件。
1、最首先看的就是main函数,分析出代码的大概逻辑
2、然后再看使用的类的定义(也就是类的h文件)。
3、类的cpp文件是最后再去看的,这块的内容往往是最复杂的。
4、如果只是关心类的使用的话只需要看类的h文件即可,其cpp文件是当你代码跑飞了的时候或是想分析代码的时候去看去修改的。

“XJ_Random”是我从自己作业拖出来使用的,如果想自己生成随机数的话那么这个“XJ_Random”就可以无视掉它,并改改main.cpp的部分用了XJ_Random的代码即可。


【main.cpp】

//【main.cpp】
#include"XJ_Student.h"
#include"XJ_Random.h"//如果不想用XJ_Random的话可以自己去完成一些随机数的生成
#include<set>

int main() {
   
	XJ_Student::sortOrder.clear();//设置多级排序。按  总分→语文→英语→数学  的顺序排序
	XJ_Student::sortOrder.push_back(XJ_Student::InfoType::Score_Total);
	XJ_Student::sortOrder.push_back(XJ_Student::InfoType::Score_Chinese);
	XJ_Student::sortOrder.push_back(XJ_Student::InfoType::Score_English);
	XJ_Student::sortOrder.push_back(XJ_Student::InfoType::Score_Math);
	//多级排序必须在插入数据之前设置,原因不解释
	
	
	set<XJ_Student> students;//学生数据
	XJ_Random::SetSeed(XJ_Random::Time());//设置随机数种子
	auto id=XJ_Random::Shuffle(2021001,2021200);//让编号随机
	for (auto i = id.begin(); i != id.end(); ++i) {
   
		students.insert(XJ_Student(*i, XJ_Random::Rand(101), XJ_Random::Rand(101), XJ_Random::Rand(101)));//添加随机的学生数据,成绩随机取0~100分
	}


	system("chcp 65001");//设置代码页,我源文件使用的是utf-8编码,系统使用的是gb2312编码,没这句话时程序输出会是乱码。
	//如果你的源文件使用的是gb2312编码那么这条设置代码页的语句就注释掉它
	printf("|  学号   |\t英语| \t数学| \t语文| \t总分|\n");//调输出格式调到人都傻,这里加空格那里减空格
	for (auto p = students
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值