按长度降序排序需用std::sort配合自定义比较函数,推荐写法为std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b) { return a.length() > b.length(); }),注意引用、std::前缀、稳定性及size_t类型安全。

用 std::sort 配合自定义比较函数最直接
默认的 std::sort 对 std::vector<:string></:string> 或原生数组排序时,按字典序(lexicographical)而非长度。要按长度降序,必须传入自定义比较逻辑:返回 true 表示第一个参数应排在第二个之前。
常见错误是写成 a.length() > b.length() 却忘了加 const & 引用,导致大量临时拷贝;或漏掉 std:: 前缀,在某些编译器下报 sort not declared。
- 推荐写法:
std::sort(v.begin(), v.end(), [](const std::string& a, const std::string& b) { return a.length() > b.length(); }); - 若用 C 风格数组(如
char* arr[10]),需配合std::strlen,且注意空指针:比较函数里先判a && b - 长度相同时是否稳定?
std::sort不保证稳定;若需保持原始相对顺序,改用std::stable_sort
std::string::length() 和 std::string::size() 选哪个?
二者完全等价,都返回 size_t 类型的字符数(不含终止符)。但别用 std::string::capacity() —— 它返回的是当前分配的内存容量,和实际长度无关,用它排序会出错。
容易踩的坑:把 length() 结果存进 int 变量,尤其在 32 位环境或超长字符串下可能截断;建议统一用 size_t 或直接参与比较,不赋值。
- 安全写法:
return a.length() > b.length();(直接比较,不转类型) - 错误示范:
int len_a = a.length();→ 潜在隐式截断警告 - 若需兼容 C++11 以前版本,
size()更早被支持,但现代项目两者无差别
输出时逐个打印还是拼接后一次性输出?
纯控制台输出就逐个 std::cout ;如果要生成单行带分隔符的结果(比如 CSV),得手动拼接。注意:拼接过程会产生新字符串对象,对大数组有性能开销。
常见疏忽是忘记换行或分隔符,导致所有字符串挤成一行;还有人误用 std::endl 替代 '\n',引发不必要的缓冲刷新,小数据无感,高频调用时拖慢速度。
- 简洁输出:
for (const auto& s : v) std::cout - 逗号分隔:
for (size_t i = 0; i - 避免
std::endl,除非明确需要立即刷缓冲
原生数组 + qsort 的老式写法还能用吗?
能,但不推荐。C 风格的 qsort 要求比较函数签名固定为 int(*)(const void*, const void*),需强制类型转换,易出错;且无法自动推导元素大小,sizeof(char*) 写错就会越界。
典型崩溃场景:把 std::string 数组传给 qsort,却按 char* 解引用,触发未定义行为;或者忘记 const 修饰,编译不过。
- 仅当维护遗留 C 代码时才考虑:
qsort(arr, n, sizeof(char*), cmp_by_len);,其中cmp_by_len必须显式reinterpret_cast - 现代 C++ 中,优先用容器 +
std::sort,类型安全、可读性强 - 若真要用
qsort,确保比较函数里用strlen(*(const char**)a) > strlen(*(const char**)b)这类双重解引用
真正麻烦的是混合编码场景——比如字符串含 UTF-8 多字节字符,length() 返回的是字节数而非“视觉长度”。这时候降序排出来的未必符合语义预期,得换成 ICU 或 std::wstring + std::locale,但那是另一个问题了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











