You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现std::string排序:同字母类型下小写字母优先?

实现std::string按字母排序且小写优先于同字母大写

默认的std::sort会按照ASCII值排序,由于大写字母的ASCII值小于对应小写字母,所以会出现大写在前的结果。要实现同字母小写在前的排序,需要自定义比较逻辑。

解决方案

给std::sort传入自定义比较逻辑,核心规则:

  • 先判断两个字符是否为同一字母(忽略大小写)
  • 若为同一字母:小写字符排在大写字符之前
  • 若不为同一字母:按字母的小写形式进行字典序排序

修改后的代码

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>  // 用于std::tolower和std::islower

int main() {
    std::string str = "aAbBcCdDeE";
    std::sort(std::begin(str), std::end(str), [](char c1, char c2) {
        // 转为unsigned char避免signed char的未定义行为
        unsigned char uc1 = static_cast<unsigned char>(c1);
        unsigned char uc2 = static_cast<unsigned char>(c2);
        
        char lower1 = std::tolower(uc1);
        char lower2 = std::tolower(uc2);
        
        if (lower1 == lower2) {
            // 同一字母:小写在前,大写在后
            return std::islower(uc1) && !std::islower(uc2);
        }
        // 不同字母:按小写字典序排序
        return lower1 < lower2;
    });
    std::cout << str << std::endl;
}

代码说明

  1. 类型转换:将char转为unsigned char,避免处理扩展ASCII字符时出现未定义行为(signed char的负值会导致std::tolower行为异常)。
  2. 小写统一判断:通过std::tolower将字符转为小写,快速判断是否为同一字母。
  3. 同字母优先级:当字符为同一字母时,仅允许小写字符排在大写字符之前。
  4. 整体字典序:不同字母时,按小写形式的字典序排列,保证整体字母顺序正确。

运行结果

执行上述代码后,输出为:

aAbBcCdDeE

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:18:15