如何实现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; }
代码说明
- 类型转换:将
char转为unsigned char,避免处理扩展ASCII字符时出现未定义行为(signed char的负值会导致std::tolower行为异常)。 - 小写统一判断:通过
std::tolower将字符转为小写,快速判断是否为同一字母。 - 同字母优先级:当字符为同一字母时,仅允许小写字符排在大写字符之前。
- 整体字典序:不同字母时,按小写形式的字典序排列,保证整体字母顺序正确。
运行结果
执行上述代码后,输出为:
aAbBcCdDeE
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

