std::sort 不能直接排自定义类型,因为默认使用 operator
std::sort 为什么不能直接排自定义类型
因为
std::sort默认用比较,而你的类/结构体没定义这个运算符,编译会报错:<code>invalid operands to binary expression。
- 最简解法:给类加
operator 成员函数,返回 <code>bool- 不想改类?传第三个参数——一个 lambda 或函数对象,比如
std::sort(v.begin(), v.end(), [](const auto& a, const auto& b) { return a.id- 注意 lambda 捕获列表为空(
[ ]),带&或=可能引发意外绑定或生命周期问题手写快排时 partition 函数边界总出错
90% 的手写错误集中在
while循环条件和指针移动顺序上,比如死循环、越界访问或漏交换。
- 统一用左闭右开区间
[l, r),pivot 选arr[l],初始化i = l + 1,j = r - 1- 内层
while必须先检查边界再访问数组:写成while (i ,而不是 <code>while (arr[i]- 交换后别忘了继续移动指针,否则可能原地打转;最后记得把
pivot换到i - 1位置stable_sort 比 sort 慢但必须用的场景
当数据本身有隐含顺序(比如按时间戳插入的记录),且你只想按某字段重排、又不希望相同字段的元素相对位置改变时,
std::stable_sort是唯一选择。
std::sort不保证稳定性,std::stable_sort时间复杂度通常是O(n log n),但空间开销更大(可能达O(n))- 对
std::list或std::forward_list,只能用list::sort()——它是稳定且原地的,但接口不同,不接受随机迭代器- 如果只是临时稳定排序少量数据,考虑用
std::vector<:pair original_index>></:pair>辅助,避免额外内存分配sort 在 vector
上编译失败
std::vector<bool></bool>是特化模板,它的iterator不是真正的随机访问迭代器,std::sort依赖的某些操作(如iter + n)不满足要求,会触发 SFINAE 失败或编译错误。立即学习“C++免费学习笔记(深入)”;
- 立刻换成
std::vector<char></char>或std::vector<int></int>,哪怕只存 0/1,也能正常用std::sort- 真要处理布尔序列且需排序逻辑?先用
std::count统计 true 个数,再用std::fill填充前段为 true,后段为 false——O(n) 且无迭代器问题- 别试图 cast 迭代器或写 traits 修复,得不偿失
事情说清了就结束
