sort函数需传迭代器范围,不接受裸数组;自定义比较函数须满足严格弱序,禁用>=等非严格比较;浮点比较不可直接用==;stable_sort保相同元素相对顺序。

sort 函数默认升序,但必须传迭代器范围
直接写 sort(arr) 会编译失败——sort 不接受裸数组名或指针,它只认一对迭代器。C++11 起支持 std::begin()/std::end(),但对原始数组仍得手动算长度;用 std::vector 最省心。
- 对
std::vector<int> v:写sort(v.begin(), v.end()) - 对
int arr[5]:写sort(arr, arr + 5),别漏掉+ 5,否则只排前几个元素 - 对
std::array<int, 5> a:可用sort(a.begin(), a.end()),也支持sort(a.data(), a.data() + a.size())
自定义比较函数必须满足严格弱序(strict weak ordering)
写错比较逻辑是运行时崩溃或排序结果乱序的主因。常见错误是用 <= 或 >= 替代 <,或者在浮点数比较中直接用 == 判断相等。
- 正确写法(降序):
[](int a, int b) { return a > b; } - 错误写法:
[](int a, int b) { return a >= b; }—— 违反“不可自反性”,comp(x,x)返回 true 就违规 - 浮点数慎用:
abs(a - b) < 1e-9只能用于判断相等,不能直接塞进比较函数返回值
sort 不稳定,相同元素的相对位置可能改变
如果业务要求“成绩相同时按学号升序”,而你只用 sort 按成绩排,学号顺序就丢了。这时候得换 stable_sort,它多一次内存拷贝,但保序。
- 性能差异:小数据量(stable_sort 可能慢 20%~50%
-
stable_sort对std::list有特化版本,用list.sort()更高效 - 若必须用
sort又要保序,可把原下标存入结构体,作为第二排序键:{score, index}
lambda 捕获外部变量时注意生命周期
在循环里定义 lambda 并传给 sort,容易捕获悬空引用。比如在 for 循环中用 [&threshold],而 threshold 是循环变量,lambda 实际执行时该变量早已析构。
立即学习“C++免费学习笔记(深入)”;
- 安全做法:值捕获
[=]或显式拷贝[threshold] - 结构体成员函数作比较器时,确保对象生命周期长于
sort调用 - 调试技巧:如果排序后出现随机崩溃或奇怪值,先检查 lambda 是否引用了栈上已销毁的变量
事情说清了就结束










