You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++中如何按多条件对结构体元素排序(蘑菇排序场景)

解决蘑菇排序问题:一次排序搞定自定义规则

嗨!作为刚学编程2个月的新手,能尝试多种方法去解决问题真的超棒👍 你之前遇到的多次调用sort()打乱排序结果的问题,本质是因为每次sort()都会完全按照新的规则重新排序,不会保留之前的排序状态。咱们只需要一次性把所有排序规则告诉sort(),就能让它一步到位排对啦!

核心思路:自定义排序比较规则

C++的sort()函数支持传入一个自定义的比较函数(或者更简洁的lambda表达式),我们可以在这个函数里把「重量降序,同重量下C>R>L」的规则写清楚,让sort()按照我们的要求排序。

具体的比较逻辑分两步:

  1. 优先比较重量:重量更大的蘑菇排在前面;
  2. 如果重量相同,比较蘑菇类型:按照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

火山引擎 最新活动