std::sort 的 lambda 必须是二元谓词,接受两个 const t& 参数、返回 bool,并满足严格弱序;常见错误是写成 a
sort 传 lambda 必须是二元谓词,返回 bool
std::sort 要求比较函数(或 lambda)接受两个
const T&参数,返回bool,且必须满足严格弱序(strict weak ordering)。常见错误是写成a 或漏掉 <code>const &导致临时对象绑定失败。实操建议:
C++ Code Review Master下载组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 始终用
a (升序)或 <code>b (降序),避免 <code> 或 <code>==- 对大对象,务必用
const auto&捕获参数,避免拷贝:比如[&](const std::string& a, const std::string& b) { return a.size()- 若 lambda 捕获外部变量(如
[threshold]),需确保该变量生命周期覆盖 sort 执行期vector
> 按 second 排序时,注意 string 的比较开销 按
pair.second(即string)排序时,每次比较都可能触发字符串字典序逐字符比对,性能敏感场景下容易成为瓶颈。实操建议:
- 若仅需按长度排序,直接比
a.second.size() ,不调用 <code>operator on string- 若需稳定排序(相同 key 保持原序),改用
std::stable_sort,但代价是时间复杂度退化为 O(n log²n)- 避免在 lambda 里做耗时操作(如
a.second.substr(0,5).c_str()),提取到预处理阶段自定义结构体排序时,operator
很多人以为必须重载
operator 才能用 <code>sort,其实 lambda 完全可以绕过它,尤其适合临时、多条件、上下文相关排序逻辑。实操建议:
- 结构体字段多、排序逻辑易变时,优先用 lambda:比如
sort(v.begin(), v.end(), [](const Node& x, const Node& y) { return x.priority != y.priority ? x.priority y.id; })- 若多个地方复用同一规则,可封装为命名 lambda 变量(C++14+):
auto cmp = [](const auto& a, const auto& b) { ... };,再传给 sort- 注意:lambda 类型是独有未命名类型,不能直接作为函数模板参数(如
sort(..., cmp)可以,但template<typename cmp> f(Cmp)</typename>调用需显式指定类型)sort 在 vector 迭代器失效后的行为是未定义的
如果排序过程中容器被其他线程修改,或在 lambda 里意外调用了
push_back/erase,迭代器立即失效,sort行为不可预测——不是崩溃就是数据错乱。实操建议:
真正容易被忽略的是:lambda 捕获列表和参数类型的组合会影响编译是否通过,比如
- 确保排序期间无任何对容器的增删改操作,包括 lambda 内部
- 若需边处理边排序,先收集待处理项,排序后再批量更新
- 调试时加断点检查 lambda 是否意外捕获了容器本身(如
[&v]),这是典型陷阱[=]捕获却在参数里写int&&,或者对const容器排序时 lambda 参数没加const &——这些错误往往只在特定编译器或优化等级下暴露。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!












