C++中"i"<"Love"返回false?std::string严格弱序比较疑问
问题原因分析
你的初始假设存在偏差:C++ 中 std::string 的 < 运算符执行的是区分大小写的逐字符ASCII码值比较,不是普通人认知里不区分大小写的自然语言排序。
- 大写英文字母的ASCII码范围是 65(对应'A')~ 90(对应'Z')
- 小写英文字母的ASCII码范围是 97(对应'a')~ 122(对应'z')
你示例中的两个字符串首字符分别是小写的i(ASCII值105)和大写的L(ASCII值76),首字符比较就已经得出L < i的结果,因此整体判断"Love" < "i"为真,"i" < "Love"自然返回false。
验证方法
如果要实现你认知里的不区分大小写的排序逻辑,需要自定义比较规则,比如先把两个字符串统一转为小写/大写后再比较:
#include <algorithm> #include <string> // 自定义不区分大小写的比较函数 bool caseInsensitiveLess(const std::string& s1, const std::string& s2) { std::string lower1 = s1; std::string lower2 = s2; std::transform(lower1.begin(), lower1.end(), lower1.begin(), ::tolower); std::transform(lower2.begin(), lower2.end(), lower2.begin(), ::tolower); return lower1 < lower2; }
调用caseInsensitiveLess("i", "Love")就会返回你预期的true。
内容的提问来源于stack exchange,提问作者African_king
相关产品推荐
相关产品推荐

