c++中如何使用结构体数组排序_c++结构体数组排序实现

说实话,当我第一次接触到 C++ 结构排序时,它让我非常头疼。
但我搞清楚之后,发现蛮有趣的,尤其是lambda表达式,就像一根魔杖一样。
我来给大家详细解释一下我自己的理解。

例如,我之前创建的一个学生管理系统,根据成绩创建了所需的课程表。
当时使用静态数组非常费力,冒泡排序还得手动写。
后来我学会了std::sort,直接开香槟了。
记住结构体是这样写的:
cpp 结构学生{ 整数ID; std::字符串名称; 双倍积分; };
关键在这里:排序的本质在于比较函数。
我最初使用的是传统的写法:
cpp bool cmpByScoreAsc(const Student& a, const Student& b) { 返回 a.score < b> 然后用它对向量进行排序:
cpp std::vector<学生> 学生 = { {1 01 ,“小张”,8 8 .5 }, {1 02 , "小李", 9 2 .0}, {1 03 ,“小王”,8 8 .5 } }; std::sort(students.begin(), Students.end(), cmpByScoreAsc);
但说实话,这样的写法有时会有点罗嗦。
特别是在 C++1 1 发布之后,lambda 表达式成为了一种可取之处。
后来我改用Lambda直接排列,代码更干净:
cpp std::sort(students.begin(), Students.end(), [](const Student& a, const Student& b) { 返回 a.score < b> 有趣的是,Lambda 还可以恶作剧。
例如,我的学生系统需要先按分数降序排序,如果分数相同则按 ID 升序排序。
使用lambda直接写:
cpp std::sort(students.begin(), Students.end(), [](const Student& a, const Student& b) { if (a.score != b.score) return a.score > b.score; //分数高的排在前面 返回 a.id < b> 这种类型的嵌套条件非常容易编写,与需要声明附加变量或编写一系列返回值的传统函数不同。
在调试时,我发现如果 Lambda 以错误的顺序编写条件,结果将完全混乱,例如B. 当分数比较结束时。
因此,写Lambda时需要格外小心,逻辑顺序不能错。

另一个危险是容器的选择。
如果使用静态数组,则需要传递头指针和尾指针,如果使用向量,则需要传递迭代器。
你必须清楚地记住这一点。
之前用数组的时候忘了传n,直接传了Students.begin()和Students.end()。
结果,编译器崩溃了,并报告“数组索引越界”。
后来用向量效果更好,因为向量迭代器会自动计算范围,省去了很多麻烦。

说实话,一旦熟悉了 std::sort 和 Lambda,编写排序代码就像玩乐高一样。
只要逻辑正确,只需几行代码就可以完成。
不过,我个人还没有做过这方面的任何多线程场景。
我听说Lambda在并行排序方面有一些陷阱,所以你可能需要注意这方面。
我记得平行排序仅在 C++1 7 中得到官方支持,但如果您在使用 Lambda 时遇到任何问题,我建议您测试一下。

简而言之,C++结构体排序有两个核心方法:std::sort和比较规则。
传统函数写起来太麻烦。
Lambda 将代码量减少了一半,并且可以动态改变条件,这很神奇。

c++中如何使用sort函数排序_c++ sort函数用法与自定义排序

说实话,第一次使用C++排序函数时,我被它的简单性和强大的功能迷惑了。
记得我在写学生成绩管理系统的时候,只是用默认的排序方式来排序。
没想到还有这么多花招可以玩。

有趣的是,左闭右开排序区间的设计相当复杂。
我之前有一个项目,我写了 sort(arr, arr+5 ) ,结果是只排序了前 4 个元素。
调试了半天,发现是对区间的理解有误。
所以现在我写代码的时候,习惯在纸上画小箭头来标记左右白开。

对于自定义排序,我更喜欢 Lambda 表达式。
例如,在对对进行排序时,编写 lambda 比声明单独的比较函数快一步。
当时,Lambda 将游戏中的角色列表按生命值 + 攻击力排在一行,这比编写 cmp 结构和函数更容易。

但最大的陷阱是类型不稳定。
有一次我在写任务系统的时候,首先要按照优先级排序,优先级相同的要按照提交时间排序。
排序后发现,相同提交时间的任务顺序被打乱了。
然后通过使用 stable_sort 来解决。
我还没有亲自测试过稳定排序在这方面的性能,但我记得它对于数据来说速度更快。
如果数据量不大,建议先使用排序。

另一个经验是,使用const引用来比较函数参数是很棒的。
我曾经写过一个比较函数作为公共参考,这导致向量中的元素被搞乱。
现在写代码,当我看到第三个参数type时,我的第一反应是const &。

要对自定义类进行排序,请记住重载运算符<。
在我的一个项目中,我创建了一个带有 id 和 name 的结构。
当我第一次直接对(项目)进行排序时,编译器给我一个错误,并说它不知道如何比较。
当时我有点困惑,但后来我想起来我需要添加运算符<。

总的来说,排序如果用得好,可以为你省去很多麻烦,但如果用得不好,就很容易陷入陷阱。
关键是要理解比较函数的规则,特别是严格的弱序条件。
如果反写的话,排序结果可能和你想象的完全不一样。