std::sort配合自定义lambda可直接按字符串长度降序排序;需注意参数类型匹配、避免误用strlen或capacity()、空容器检查及稳定性需求时改用std::stable_sort。

用 std::sort 配合自定义比较函数最直接
标准库的 std::sort 支持传入二元谓词,不需要手写排序逻辑。对 std::vector<:string></:string> 或原生 std::string 数组,只需提供一个按长度降序比较的 lambda 即可。
常见错误是把升序逻辑误当降序用,比如写成 a.length() —— 这会得到升序结果。
- 降序必须返回
a.length() > b.length()(或等价形式) - 若字符串指针数组(如
std::string*),比较函数参数类型要同步改为const std::string*& - 注意
std::string::length()和size()等价,但别误用capacity()
std::vector<:string> arr = {"hi", "hello", "a", "world"};
std::sort(arr.begin(), arr.end(), [](const std::string& a, const std::string& b) {
return a.length() > b.length(); // 降序:长的排前面
});
// 结果: {"hello", "world", "hi", "a"}
</:string>
原生 C 风格数组需配合 std::begin/std::end 或指针算术
如果用的是 std::string str_arr[5] 这类固定大小数组,std::sort 不能直接接受数组名,必须显式传入首尾迭代器。
容易踩的坑是把数组名当指针传给 std::sort(str_arr, str_arr + 5, ...) 看似可行,但一旦数组是函数参数(退化为指针),sizeof 就失效,长度信息丢失。
- 推荐统一用
std::begin(str_arr)和std::end(str_arr),类型安全且语义清晰 - 若数组大小未知,优先转成
std::vector再处理,避免越界风险 - 不要对未初始化的
std::string元素调用length(),虽通常安全,但属不良习惯
稳定排序要用 std::stable_sort,尤其有相同长度字符串时
当多个字符串长度相等(比如 "ab" 和 "cd" 都长为 2),普通 std::sort 不保证它们的原始相对顺序;如果业务要求“同长字符串保持输入顺序”,就得换用 std::stable_sort。
性能上,std::stable_sort 一般比 std::sort 略慢、内存开销略高,但差异在小数据量下几乎不可测。
- 仅当明确需要稳定性时才替换,不要无脑用
stable_sort - 比较函数写法完全一样,只需改函数名
- 若后续还要按字典序二次排序(同长时),稳定排序能天然保留第一次的分组效果
避免用 strlen 处理 std::string —— 类型不匹配且低效
有人看到“按长度排序”就本能想到 C 的 strlen,但在 std::string 场景下这是错的:strlen 要求 const char*,而 std::string::c_str() 调用有额外开销,且 std::string::length() 是 O(1) 成员函数。
更隐蔽的问题是:若字符串含嵌入空字符('\0'),strlen 会提前截断,导致长度计算错误。
- 永远优先用
a.length()或a.size() - 只有处理纯 C 字符串(
char*数组)时,才考虑strlen - 混合使用
std::string和char*时,务必确认数据来源和生命周期
sort —— 虽然标准库允许对空区间排序,但若比较函数里做了未经验证的访问(比如取 .front()),就会崩。写比较函数时,假设输入总是合法的,但调用前做空检查仍是稳健做法。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











