直接用 std::sort 配合默认比较器即可对 ASCII 字符串排序,因其按字符 ASCII 值升序排列;但 UTF-8 中文等多字节字符需先解码为 std::u32string 才能正确排序。

直接用 std::sort 配合默认比较器就行
只要字符串是 std::string 或 C 风格字符数组,std::sort 默认按字符的 ASCII 值升序排列,不需要额外写比较函数。这是因为 char 本身就是整数类型,operator< 直接比较 ASCII 码。
常见错误是误以为要手写循环或调用 qsort——C++ 标准库已内置高效、安全的方案。
- 对
std::string:先转成可修改的字符范围(如用&s[0]或s.data()),再传给std::sort - 对 C 字符串(
char[]):确保以'\0'结尾,且传入有效长度(不含终止符) - 别对
const std::string直接排序——它不可修改;需先拷贝一份
std::sort 的参数边界必须小心
容易出错的地方是迭代器/指针范围不匹配,导致未定义行为或漏排最后一个字符。比如:
std::string s = "bac"; std::sort(s.begin(), s.end()); // ✅ 正确:[begin, end) 覆盖全部字符
若用原始指针操作:
立即学习“C++免费学习笔记(深入)”;
char buf[] = "bac"; std::sort(buf, buf + 3); // ✅ 正确:3 是字符数,不是 strlen(buf)+1
-
std::sort(first, last)的last是**开区间终点**,必须指向末字符的下一个位置 - 用
strlen(buf)得到长度后,直接加到首地址即可;不要加 1(那会越界到'\0') - 对
std::string优先用.begin()/.end(),比&s[0]更安全(避免空字符串时s[0]未定义)
中文或 UTF-8 字符串不能直接这样排
ASCII 排序只对单字节字符可靠。如果字符串含中文、emoji 或其他 UTF-8 多字节字符,std::sort 会按字节而非字符排序,结果完全乱序(比如把 UTF-8 编码的两个字节拆开比较)。
- 确认输入纯 ASCII(即每个
char∈ [0–127])再用此法 - 检查方式:遍历字符串,用
static_cast<unsigned char>(c) < 128判断 - 需要真正按 Unicode 码点排序?得先做 UTF-8 解码,转成
std::u32string再排——这已是另一套处理逻辑
性能与稳定性不用操心
std::sort 在 libstdc++ 和 libc++ 中都是 introsort(快排+堆排+插排混合),平均 O(n log n),最坏也是 O(n log n),且是稳定实现。没必要自己写冒泡或找第三方排序函数。
- 小字符串(≤32 字符)编译器可能内联优化,实际很快
- 避免在循环里反复构造
std::string后排序——考虑复用对象或用std::string_view观察原始数据 - 如果只是想“判断是否已升序”,用
std::is_sorted(s.begin(), s.end())比排完再比更省


















