C++ string compare用法 C++字符串字典序比较返回值含义【文档】

5次阅读

std::String::compare 返回int:小于0表示调用对象字典序小于参数,等于0表示相等,大于0表示大于参数;其设计兼容strcmp,适用于排序,但不可直接用于布尔判断。

C++ string compare用法 C++字符串字典序比较返回值含义【文档】

compare 函数返回值到底代表什么

std::string::compare 不返回布尔值,也不直接告诉你“相等”或“不相等”,它返回一个 int:小于 0 表示调用对象字典序**小于**参数,等于 0 表示**相等**,大于 0 表示**大于**参数。这个设计和 C 的 strcmp 一致,方便做排序判断(比如用在 std::sort 的自定义比较器里)。

常见误解是把返回值当 true/false 用:if (s1.compare(s2)) —— 这样写逻辑反了:相等时返回 0(即 false),不等时反而非零(true),容易写出 bug

compare 的五种重载形式怎么选

最常用的是全字符串比较:s1.compare(s2);但实际中常需比子串或混合类型,得看参数类型匹配:

  • s1.compare(pos1, len1, s2):从 s1 下标 pos1 开始取最多 len1 个字符,与整个 s2 比较
  • s1.compare(pos1, len1, s2, pos2, len2):两边都截取,注意 len2s2 中的长度,不是下标
  • s1.compare("abc"):C 风格字符串,隐式转 std::string_viewc++17 起)或构造临时 string
  • s1.compare(0, std::string::npos, s2) 等价于 s1.compare(s2)npos 表示“到末尾”

注意:如果 pos1 >= s1.Length(),会抛 std::out_of_range;而 len1 超出范围会被自动截断,不会报错。

立即学习C++免费学习笔记(深入)”;

和 ==、 运算符比有什么区别

语义上完全等价:s1 == s2s1.compare(s2) == 0 效果一样;s1 和 s1.compare(s2) 也一样。但关键差异在性能和场景:

  • 运算符重载更简洁、可读性高,日常判等/大小关系优先用 ==
  • compare 适合需要**一次调用获取完整顺序信息**的场合,比如实现 operator(C++20)、写 std::map 的比较器、或避免多次调用(如先判等再判大小)
  • 部分老代码或跨语言接口(如封装 C 库)会强制要求返回 int,这时必须用 compare

性能上无实质差别,现代编译器对两者优化程度接近,不必为“效率”刻意选 compare

容易踩的坑:npos、空字符串、UTF-8 字节序

compare 是纯字节比较,不理解 UTF-8 编码逻辑。比如两个中文字符串若用 UTF-8 存储,"你好".compare("世界") 比的是 UTF-8 字节序列,结果符合 Unicode 码点顺序,但不是“按汉字笔画”或“拼音”排——这是常见误以为“字典序=自然语言序”的根源。

  • std::string::nposlen 参数没问题,但作 pos 就会越界(npos 是极大值,远超任何合法下标)
  • 空字符串 "" 比任何非空字符串都小,"".compare("a") 返回负数
  • 如果字符串含嵌入 null 字节(),compare 仍会比较到末尾(因为 std::string 是 length-aware 的),但 compare("abcd", "abc") 会把 当普通字符处理

真正要做国际化排序,得用 std::locale 或 ICU 库,compare 做不了。

text=ZqhQzanResources