最直接标准做法是用 std::sort 配合 lambda 比较字符串长度,即 std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.length() < b.length(); })。

用 std::sort 配合 lambda 比较长度最直接
标准做法是调用 std::sort,传入自定义比较逻辑——只看字符串的 length() 或 size()。注意别写成按字典序排(那是默认行为),必须显式提取长度比较。
常见错误是把 std::string 当作 C 风格字符数组处理,比如用 strlen,这会导致编译失败或未定义行为;C++ 字符串对象要走成员函数。
- 对
std::vector<:string></:string>排序:直接用std::sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.length() - 若字符串存于
std::array或原始数组,需传对应指针范围,例如std::sort(arr, arr + N, ...) - 升序排长度用
,降序改用 <code>>即可
排序稳定吗?std::stable_sort 什么时候需要
std::sort 不保证稳定性,即长度相同的字符串相对顺序可能改变。如果原始顺序有业务含义(比如同长度的字符串本就按插入时间排列),就得换 std::stable_sort。
性能上,std::stable_sort 通常比 std::sort 稍慢、内存开销略高,但多数场景差异不明显。别为了“听起来更安全”盲目替换。
立即学习“C++免费学习笔记(深入)”;
- 稳定版写法:
std::stable_sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) { return a.size() -
size()和length()完全等价,选哪个纯看风格偏好 - 若容器本身是
std::list,应优先用其成员函数sort(),它内部实现稳定且避免迭代器失效问题
原始字符串数组(char*)怎么处理
遇到 const char* 数组(比如 const char* arr[] = {"hello", "a", "world"};),不能直接调用 std::string::length(),得先转为 std::string 或用 std::strlen。
用 std::strlen 更轻量,但务必确保每个指针非空且指向以 '\0' 结尾的有效内存,否则崩溃。
- 推荐方式:
std::sort(arr, arr + N, [](const char* a, const char* b) { return std::strlen(a) - 若存在空指针,必须提前过滤或在 lambda 中加判空:
!a ? false : (!b ? true : std::strlen(a) - 注意:这种排序只重排指针本身,不复制字符串内容
自定义结构体里含字符串字段,按该字段长度排序
比如结构体 struct Item { std::string name; int id; };,想按 name 长度排,lambda 里访问成员即可,无需重载 operator。
容易踩的坑是误写成 return a.name.length() 却忘了 lambda 参数类型声明——若用 <code>auto 要配 const auto&,否则临时对象或拷贝开销大。
- 正确写法:
std::sort(items.begin(), items.end(), [](const Item& a, const Item& b) { return a.name.length() - 若结构体很大,传值会低效;哪怕只比长度,也建议坚持用
const& - 别在比较函数里做耗时操作(如反复调用
to_string或正则匹配),长度排序本应是 O(1) 每次比较
长度排序本身简单,但实际项目中常混着空值、多级排序(先按长度再按字典序)、或跨容器类型,这些细节比算法选择更容易出错。


















