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; } });
代码说明
- 分组判断:先区分元素属于前组(
height<=i)还是后组(height>i),保证前组元素全部排在后组之前 - 前组排序:同属前组的元素,按
value从大到小排列 - 后组处理:若不需要对后组元素排序,返回
false即可保留它们的原始相对顺序;如果需要排序后组,可在此处补充对应逻辑 - 性能优化:使用
const Object&作为参数,避免不必要的结构体拷贝
测试验证
用给定测试用例执行上述代码后,结果与预期完全一致:{{5, 2}, {3, 2}, {3, 10}, {2, 10}, {2, 1000000000}}
内容的提问来源于stack exchange,提问作者Penny M.
相关产品推荐
相关产品推荐

