按字符串长度升序排序需自定义比较函数,正确写法为返回 a.length()
用
std::sort配合自定义比较函数排序字符串数组直接用
std::sort就能搞定,关键在比较函数怎么写。默认按字典序排,但你要按长度排,就得传一个 lambda 或函数对象进去。常见错误是把比较逻辑写反:升序要返回
a.length() ,降序则是 <code>a.length() > b.length()。写反了结果完全颠倒,还不好排查。
- 如果用
std::vector<:string></:string>存字符串,std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.length() 就是升序- 降序就把
换成 <code>>;注意别用size()代替length()—— 虽然等价,但习惯统一用length()更清晰- 若字符串里含 Unicode(比如中文),
length()返回的是 UTF-8 字节数,不是字符数;真要按“字符个数”排得先用 ICU 或std::wstring+std::mbstowcs转码,否则会出错对 C 风格字符串数组(
char*)排序要小心内存和空指针C++ 里如果用
const char* arr[]这种原始数组,std::sort依然能用,但比较函数必须处理空指针,否则一碰到nullptr就崩。典型崩溃错误:
std::sort(arr, arr + n, [](const char* a, const char* b) { return strlen(a) —— 如果 <code>a或b是nullptr,strlen直接触发段错误。
- 安全写法:先判空,比如
!a ? (b ? -1 : 0) : (!b ? 1 : strlen(a) ,但更推荐提前过滤或确保无空指针- 升序时短字符串排前面,但所有空指针建议统一放开头或结尾,不能依赖
strlen(nullptr)- 性能上,每次调用
strlen都要遍历一遍,如果数组大、字符串长,可预存长度到辅助数组再排序稳定排序用
std::stable_sort保留相同长度字符串的原始顺序当多个字符串长度相等时,你可能希望它们相对位置不变——比如日志里同长度的 ID 要保持输入顺序。
std::sort不保证稳定性,这时候必须换std::stable_sort。它接口和
std::sort完全一样,只是内部算法不同。代价是时间复杂度略高(通常是O(n log²n)),但多数场景感知不到。
- 用法完全一致:
std::stable_sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.length()- 如果用
std::string_view替代std::string,比较更快(避免构造临时对象),但前提是源字符串生命周期足够长- 注意:
std::stable_sort对原始指针数组同样适用,但比较函数仍需处理空指针问题输出前确认容器是否为空或含非法字符
排序完直接循环输出看似简单,但实际常因边界没检查导致崩溃或乱码。尤其从文件或网络读入的字符串可能含
\0、控制字符或 BOM 头。比如用
fgets读 C 字符串,末尾带\n,strlen算的是包含换行符的长度;而std::getline默认去掉\n,结果就不一样。
- 输出前建议先验证:
if (str.empty()) continue;或跳过含\0的字符串(str.find('\0') != std::string::npos)- 调试时加一句
std::cout ,能快速发现不可见字符干扰- 如果最终要写入文件,注意 Windows 下换行符是
\r\n,别让排序后输出混入多余回车排序本身不难,难的是边界情况——空串、空指针、编码差异、稳定性要求、不可见字符。这些点漏掉一个,程序就可能在线上突然出错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!












