日志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.sumy.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 表达式 更简洁,而传统函数形式适合更复杂的场景。
全部评论

相关推荐

2024-12-30 14:39
哈尔滨理工大学 C++
#include #include #include &nbsp;&nbsp;//&nbsp;用于排序using&nbsp;namespace&nbsp;std;//&nbsp;定义学生结构体struct&nbsp;Student&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;name;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;姓名&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;programming;&nbsp;&nbsp;&nbsp;//&nbsp;编程成绩&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;math;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数学成绩&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;english;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;英语成绩&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;计算总分&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;totalScore()&nbsp;const&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;programming&nbsp;+&nbsp;math&nbsp;+&nbsp;english;&nbsp;&nbsp;&nbsp;&nbsp;}};//&nbsp;自定义排序规则bool&nbsp;compareStudents(const&nbsp;Student&nbsp;&amp;a,&nbsp;const&nbsp;Student&nbsp;&amp;b)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(a.totalScore()&nbsp;!=&nbsp;b.totalScore())&nbsp;{ return a.totalScore() >&nbsp;b.totalScore();&nbsp;&nbsp;//&nbsp;按总分从高到低排序&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}int&nbsp;main()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;n; cin >>&nbsp;n;&nbsp;&nbsp;//&nbsp;读取学生数量&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;定义学生数组&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;students[n];&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取每个学生的信息&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp; cin >> students[i].name >> students[i].programming >> students[i].math >>&nbsp;students[i].english;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;对学生数组进行排序&nbsp;&nbsp;&nbsp;&nbsp;sort(students,&nbsp;students&nbsp;+&nbsp;n,&nbsp;compareStudents);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;输出排序后的学生姓名和总分&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务