You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++自定义排序函数异常:按height与value规则排序失效

C++ std::sort 自定义排序规则失效问题解决

问题场景

定义如下结构体:

struct Object {
    int value, height;
    Object(int v, int h) {
        this->value = v;
        this->height = h;
    }
};

使用std::vector<Object>存储对象,期望实现的排序规则:

  • height大于指定值i的元素放在末尾
  • height小于等于i的元素按value降序排列

测试用例:std::vector<Object> v = {{3, 10}, {5, 2}, {3, 2}, {2, 10}, {2, 1000000000}};,i=2,期望排序结果:{{5, 2}, {3, 2}, {3, 10}, {2, 10}, {2, 1000000000}}

原代码未达到预期效果:

int i = 2;

std::sort(v.begin(), v.end(), [ & ](Object a, Object b) {
    if (b.height > i) {
        return false;
    }
    if (a.height > i) {
        return false;
    }

    return a.value > b.value;
});

错误原因

原比较函数不满足std::sort要求的严格弱序:

  • 当a.height > i且b.height <= i时,当前函数返回false
  • 反过来比较b和a时,函数同样返回false
  • 这会让std::sort判定a和b等价,不会交换两者位置,最终导致排序结果不符合预期

正确实现

需要明确所有场景下的比较逻辑,确保满足严格弱序:

int i = 2;

std::sort(v.begin(), v.end(), [&](const Object& a, const Object& b) {
    bool a_in_front = (a.height <= i);
    bool b_in_front = (b.height <= i);

    if (a_in_front != b_in_front) {
        // 前组元素必须排在后组元素前面
        return a_in_front;
    } else if (a_in_front) {
        // 同属前组,按value降序排列
        return a.value > b.value;
    } else {
        // 同属后组,保持原相对顺序(若需排序后组可添加对应逻辑)
        return false;
    }
});

代码说明

  1. 分组判断:先区分元素属于前组(height<=i)还是后组(height>i),保证前组元素全部排在后组之前
  2. 前组排序:同属前组的元素,按value从大到小排列
  3. 后组处理:若不需要对后组元素排序,返回false即可保留它们的原始相对顺序;如果需要排序后组,可在此处补充对应逻辑
  4. 性能优化:使用const Object&作为参数,避免不必要的结构体拷贝

测试验证

用给定测试用例执行上述代码后,结果与预期完全一致:
{{5, 2}, {3, 2}, {3, 10}, {2, 10}, {2, 1000000000}}


内容的提问来源于stack exchange,提问作者Penny M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:30:44