struct 排序必须写自定义比较函数,不能直接用 sort,因为 sort 默认只支持内置类型或已重载 operator
struct 排序必须写自定义比较函数,不能直接用
sort
因为
sort默认只支持内置类型或已重载operator 的类型。结构体没有默认大小关系,不写比较逻辑就会编译报错:<code>invalid operands to binary expression。常见错误是直接传vector<mystruct></mystruct>给sort却没给第三个参数。实操建议:
- 最常用方式:传一个 lambda 表达式作为第三个参数,捕获简洁、作用域清晰
- 也可写独立的
bool函数,适合逻辑复杂或需复用时- 若频繁使用,可为结构体重载
operator,但要注意语义是否真的符合“小于”的自然含义lambda 比较器里别写
&捕获外部变量来改排序逻辑比如有人想动态切升/降序,写成
[&order](const auto& a, const auto& b) { return order ? a.x b.x; }—— 这看似灵活,但sort内部可能多次调用比较器,且不保证调用顺序;若order在排序中途被修改,行为未定义,极易出错。正确做法:
立即学习“C++免费学习笔记(深入)”;
- 排序前确定好顺序,用不同 lambda 或提前绑定值:
[order](...){ return order ? ... : ...; }(值捕获)- 需要运行时切换?封装成函数工厂:
auto cmp = make_comparator_by_field("x", true);,内部返回固定 lambda- 避免在比较器里做耗时操作(如查表、字符串转换),
sort时间复杂度是 O(n log n),每多一次计算都放大开销多字段排序要小心短路逻辑和
std::tie的坑比如按
age升序、name降序,手写容易漏掉==判断分支,导致结果错乱。更安全的是用std::tie,但它要求所有字段类型都支持,且降序需手动取反。