std::string compare与重载运算符的性能对比
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 相当。