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