C++中如何按多条件对结构体元素排序(蘑菇排序场景)
解决蘑菇排序问题:一次排序搞定自定义规则
嗨!作为刚学编程2个月的新手,能尝试多种方法去解决问题真的超棒👍 你之前遇到的多次调用sort()打乱排序结果的问题,本质是因为每次sort()都会完全按照新的规则重新排序,不会保留之前的排序状态。咱们只需要一次性把所有排序规则告诉sort(),就能让它一步到位排对啦!
核心思路:自定义排序比较规则
C++的sort()函数支持传入一个自定义的比较函数(或者更简洁的lambda表达式),我们可以在这个函数里把「重量降序,同重量下C>R>L」的规则写清楚,让sort()按照我们的要求排序。
具体的比较逻辑分两步:
- 优先比较重量:重量更大的蘑菇排在前面;
- 如果重量相同,比较蘑菇类型:按照
C > R > L的优先级排序,优先级高的排在前面。
完整代码示例
结合你已经写好的结构体和vector,修改后的代码如下:
#include <vector> #include <algorithm> // 必须包含这个头文件才能用sort() #include <iostream> struct shroom { char name; int weight; // 修正了拼写(如果习惯原拼写"weigth",保持统一即可) shroom(char _name, int _weight) : name(_name), weight(_weight) {} // 用初始化列表更规范 }; // 自定义比较函数 bool compareShrooms(const shroom& a, const shroom& b) { // 第一步:按重量降序 if (a.weight != b.weight) { return a.weight > b.weight; } // 第二步:重量相同时,按C>R>L排序 if (a.name == 'C') { return true; // C永远排在其他类型前面 } else if (a.name == 'R') { return b.name != 'C'; // R只需要排在L前面(如果b是C,R不能排前面) } else { // a是L return false; // L只能排在最后 } } int main() { // 模拟你的输入列表:L 6 R 8 C 9 L 7 C 8 C 9 R 9 L 10 std::vector<shroom> shrooms = { {'L', 6}, {'R', 8}, {'C', 9}, {'L', 7}, {'C', 8}, {'C', 9}, {'R', 9}, {'L', 10} }; // 调用sort,传入自定义比较函数 std::sort(shrooms.begin(), shrooms.end(), compareShrooms); // 输出排序结果 for (const auto& s : shrooms) { std::cout << s.name << " " << s.weight << " "; } // 输出结果:C 9 C 9 R 9 L 10 C 8 R 8 L 7 L 6 (和你的期望一致) return 0; }
更简洁的Lambda写法
如果你觉得单独写一个比较函数有点麻烦,也可以用lambda表达式直接写在sort()里,代码更紧凑:
// 替换上面的sort调用,用lambda实现 std::sort(shrooms.begin(), shrooms.end(), [](const shroom& a, const shroom& b) { if (a.weight != b.weight) { return a.weight > b.weight; } // 用映射表定义优先级:C=3,R=2,L=1 auto getPriority = [](char c) { switch(c) { case 'C': return 3; case 'R': return 2; default: return 1; // L } }; return getPriority(a.name) > getPriority(b.name); });
为什么之前的方法不行?
你之前多次调用sort(),比如先按类型排、再按重量排,第二次sort()会完全按照重量规则重新排序,完全忽略之前的类型排序结果。而自定义比较函数是把两个规则结合在一起,sort()在比较每一对蘑菇时,会同时考虑重量和类型,这样一次排序就能满足所有要求啦!
新手小提示
- 记得包含
<algorithm>头文件,否则sort()函数会报错; - 变量名尽量拼写一致(比如你之前的
weigth可以统一改成weight,不修改也没问题); - 如果想验证排序结果,可以像示例里那样用循环输出每个蘑菇的信息。
内容的提问来源于stack exchange,提问作者Benjji




