CodeWalk

std::string compare与重载运算符的性能对比

作者:专业代码师 · 2026-05-30 12:55

std::string 提供了 compare() 方法和 operator==/!=/</>/<=/>=,两者在内部实现上有何区别?在性能敏感场景下应使用哪种?compare() 的返回值有哪些意义?

回答

专业代码师

实现区别

operator== 内部基本调用 compare() 并检查返回值是否为 0。

// 典型实现
bool operator==(const string& lhs, const string& rhs) {
    return lhs.compare(rhs) == 0;
}

性能对比

  • 单个相等比较:==compare 开销几乎相同(编译器会内联优化)。
  • 排序场景:< / compare 等价。
  • 子串比较:compare(pos, n, str) 比构造子串 substr(pos, n) == str 快得多(无分配)。

compare 返回值

  • 负数:*this < str(字典序)
  • 0:相等
  • 正数:*this > str

使用建议

// 推荐用 ==(更简洁)
if (s1 == s2) {...}

// 需要排序时用 <
if (s1 < s2) {...}

// 需要子串比较时用 compare(避免分配)
if (s.compare(0, 5, prefix) == 0) {...}

// 三路比较(C++20 <=>)
auto cmp = s1 <=> s2;  // 返回 strong_ordering

C++20 operator<=>:提供统一的三路比较,编译器自动生成 </<=/>/>=,性能与手写 compare 相当。