1. 告别繁琐的cmp函数:Lambda表达式重构多级排序
十年前我刚接触C++时,为结构体数组写cmp函数就像在解一道复杂的数学题——每次排序规则变化都得重新定义函数,调试时在多个cmp函数间跳转简直让人崩溃。直到发现Lambda表达式这个神器,原来三四十行的排序代码现在三行就能搞定,特别是处理多级排序时,代码可读性提升了不止一个量级。
传统cmp函数就像固定菜单,而Lambda表达式则是自助餐——需要什么规则现场定义,用完即走不污染命名空间。这种特性在处理电商商品排序(价格->销量->评分)、学生成绩排名(总分->数学->语文)等多级排序场景时尤其高效。下面通过5个实际案例,带你掌握这套现代C++的排序方法论。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多级排序的传统实现痛点
2.1 典型cmp函数实现示例
cpp复制struct Student {
string name;
int math;
int physics;
int total;
};
bool cmp(const Student& a, const Student& b) {
if (a.total != b.total)
return a.total > b.total;
if (a.math != b.math)
return a.math > b.math;
return a.physics > b.physics;
}
// 使用时
vector<Student> students;
sort(students.begin(), students.end(), cmp);
这种写法有三个明显缺陷:
- 排序规则变更需要修改或新增cmp函数
- 多个排序规则共存时命名困难(cmp_by_total_math_phy、cmp_by_phy_math_total...)
- cmp函数脱离调用上下文,可读性差
2.2 企业级代码中的维护难题
在某金融数据系统项目中,我见过一个包含27个cmp函数的排序模块。当业务要求支持动态排序规则时,开发者不得不采用:
cpp复制if (sortType == "total_math_phy") {
sort(data.begin()
