日志18
自定义比较函数是排序算法中用来定义元素比较规则的关键部分,决定了排序结果的顺序。下面详细解释你的代码中使用的自定义比较函数。
自定义比较函数的概念
自定义比较函数是一种用来比较两个元素的方法,通常返回一个布尔值:
- 返回
true
表示第一个元素应该排在第二个元素之前。 - 返回
false
表示第一个元素应该排在第二个元素之后。
在你的代码中,自定义比较函数通过 Lambda 表达式 实现。
Lambda 表达式分解
[](const student& x, const student& y) { if (x.sum == y.sum) { return x.name < y.name; } else { return x.sum > y.sum; } }
这是一个 Lambda 表达式,它定义了 student
类型元素的比较规则。
1. 输入参数
const student& x, const student& y
- 表示要比较的两个
student
对象。 - 使用常量引用(
const student&
),避免拷贝对象,提升性能。
2. 逻辑分析
if (x.sum == y.sum) { return x.name < y.name; } else { return x.sum > y.sum; }
- 第一层比较: 检查
x.sum
是否等于y.sum
。相等时,比较 name:使用 x.name < y.name,按字典序升序排列。 - 第二层比较: 如果
x.sum
和y.sum
不相等:使用 x.sum > y.sum,按总分降序排列。
什么时候用自定义比较函数?
- 当排序规则不是简单的升序或降序时,比如:多字段排序:按主字段排序,主字段相同再按次字段排序。特定逻辑排序:如优先处理某些类型的元素。
示例:手动定义比较函数
除了用 Lambda 表达式,也可以定义一个普通的函数来实现同样的比较规则:
定义比较函数
bool compare(const student& x, const student& y) { if (x.sum == y.sum) { return x.name < y.name; } else { return x.sum > y.sum; } }
使用比较函数
sort(s.begin(), s.end(), compare);
这种方式与 Lambda 表达式功能相同,适合更复杂的逻辑。
总结
- 自定义比较函数是排序的灵魂,灵活定义可以满足各种排序需求。
- 使用 Lambda 表达式 更简洁,而传统函数形式适合更复杂的场景。