我刚看了一些关于使用的建议
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
代替
if( s == t )
{
我几乎总是使用最后一个,因为我已经习惯了它,它感觉自然,更具可读性 . 我甚至不知道有一个单独的比较功能 . 更确切地说,我认为==会调用compare() .
What are the differences? In which contexts should one way be favored to the other?
我只考虑我需要知道字符串是否与另一个字符串相同的情况 .
10 回答
这就是标准对
operator==
的看法好像没有太大区别!
std::string::compare()返回
int
:如果
s
和t
相等,则如果
s
小于t
,则如果
s
大于t
,则如果您希望第一个代码段与第二个代码段相同,则应该实际读取:
等于运算符仅测试相等性(因此其名称)并返回
bool
.要详细说明用例,如果您对两个字符串彼此之间的关系(更少或更多)感兴趣,那么_793126可能会很有用 . PlasmaHH合理地提到了树木,它也可以是一个字符串插入算法,旨在保持容器的排序,上述容器的二分法搜索算法,等等 .
EDIT: 正如Steve Jessop在评论中指出的那样,
compare()
对快速排序和二进制搜索算法最有用 . 仅使用std::less即可实现自然排序和二分法搜索 .compare
具有用于比较子字符串的重载 . 如果你要比较整个字符串,你应该只使用==
运算符(无论它是否调用compare
都非常无关紧要) .在内部,string :: operator ==()使用string :: compare() . 请参考:CPlusPlus - String::Operator==()
我写了一个小应用程序来比较性能,显然如果你在调试环境中编译和运行你的代码,String :: compare()比string :: operator ==()略快 . 但是,如果在Release环境中编译和运行代码,两者都基本相同 .
仅供参考,为了得出这样的结论,我进行了1,000,000次迭代 .
为了在调试环境中证明为什么string :: compare更快,我去了程序集,这里是代码:
DEBUG BUILD
字符串::运算符==()
字符串::比较()
你可以在string :: operator ==()中看到它必须执行额外的操作(添加esp,8和movzx edx,al)
RELEASE BUILD
字符串::运算符==()
字符串::比较()
两个汇编代码都非常相似,因为编译器执行优化 .
最后,在我看来,性能提升可以忽略不计,因此我真的会让开发人员决定哪一个是首选的,因为它们都能达到相同的结果(特别是当它是发布版本时) .
compare()
等同于strcmp() .==
是简单的等式检查 .compare()
因此返回一个int
,==
是一个布尔值 .如果字符串相等,
compare()
将返回false
(嗯,0
) .所以不要轻易地换另一个 .
使用哪个使代码更具可读性 .
如果您只想检查字符串相等性,请使用==运算符 . 确定两个字符串是否相等比查找排序更简单(这是compare()给出的),因此在您的情况下使用相等运算符可能会更好 .
更长的答案:API提供了一种检查字符串相等性的方法和一种检查字符串排序的方法 . 你想要字符串相等,所以使用相等运算符(这样你的期望和库实现者的期望一致 . )如果性能很重要,那么你可能想测试两种方法并找到最快的 .
这里没有涉及的一件事是,它取决于我们将字符串与c字符串,c字符串与字符串或字符串与字符串进行比较 .
一个主要的区别是,为了比较两个字符串,在进行比较之前检查大小相等,这使得==运算符比比较更快 .
这是我在Debian 7上看到的比较
在Visual Studio 2012调试器中,检查字符串时,只有以下方法正常工作:
返回true .
返回1,和
return:no运算符“==”匹配这些操作数 .
return:发生了未指定的错误 .
假设考虑两个字符串s和t .
给他们一些 Value .
当您使用 (s==t) 比较它们时,它返回一个布尔值(true或false,1或0) .
但是当你使用 s.compare(t) 进行比较时,表达式会返回一个值
(i) 0 - 如果s和t相等
(ii) <0 - 如果s中第一个不匹配字符的值小于t的值或者s的长度小于s的长度吨 .
(iii) >0 - 如果t中第一个不匹配字符的值小于s的值或者t的长度小于s的长度 .