C ++string==和compare()之间的区别?

我刚读了一些关于使用的build议

std::string s = get_string(); std::string t = another_string(); if( !s.compare(t) ) { 

代替

 if( s == t ) { 

我几乎总是使用最后一个,因为我习惯了,感觉自然,更具可读性。 我甚至不知道有一个单独的比较函数。 更确切地说,我认为==会调用compare()。

有什么区别? 在哪种情况下,一种方式应该对另一种方式有利?

我正在考虑的情况下,我需要知道一个string是否是另一个string相同的值。

这是关于operator==的标准

21.4.8.2运算符==

 template<class charT, class traits, class Allocator> bool operator==(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs) noexcept; 

返回:lhs.compare(rhs)== 0。

似乎没有太大的区别!

std :: string :: compare()返回一个int

  • 如果st相等,则等于零,
  • 如果s小于t ,则小于零,
  • 如果s大于t则大于零。

如果你希望你的第一个代码片段等同于第二个代码片段,那么它实际上应该是:

 if (!s.compare(t)) { // 's' and 't' are equal. } 

等号运算符只testing相等(因此它的名字)并返回一个bool

为了详细说明用例, compare()可以是有用的,如果你感兴趣的是两个string如何相互关联(或多或less),当他们碰巧是不同的。 PlasmaHH正确地提到了树,它也可以是一个string插入algorithm,旨在保持容器的sorting,上述容器的二分searchalgorithm,等等。

编辑:正如Steve Jessop在评论中指出的, compare()对于快速sorting和二分searchalgorithm是最有用的。 自然sorting和二分search只能用std :: less来实现。

compare有重载比较子string。 如果你正在比较整个string,你应该只使用==运算符(而不pipe它是否调用compare是非常不相关的)。

在内部,string :: operator ==()使用string :: compare()。 请参考: CPlusPlus – String :: Operator ==()

我写了一个小的应用程序来比较性能,显然如果你在debugging环境下编译和运行你的代码,String :: compare()比string :: operator ==()要快一些。 但是如果你在Release环境下编译和运行你的代码,两者几乎是一样的。

仅供参考,我跑了100万次迭代,以得出这样的结论。

为了certificate为什么在debugging环境中string::比较快,我去了大会,这里是代码:

debugging构build

string::运算符==()

  if (str1 == str2) 00D42A34 lea eax,[str2] 00D42A37 push eax 00D42A38 lea ecx,[str1] 00D42A3B push ecx 00D42A3C call std::operator==<char,std::char_traits<char>,std::allocator<char> > (0D23EECh) 00D42A41 add esp,8 00D42A44 movzx edx,al 00D42A47 test edx,edx 00D42A49 je Algorithm::PerformanceTest::stringComparison_usingEqualOperator1+0C4h (0D42A54h) 

string::比较()

  if (str1.compare(str2) == 0) 00D424D4 lea eax,[str2] 00D424D7 push eax 00D424D8 lea ecx,[str1] 00D424DB call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0D23582h) 00D424E0 test eax,eax 00D424E2 jne Algorithm::PerformanceTest::stringComparison_usingCompare1+0BDh (0D424EDh) 

你可以看到,在string::运算符==(),它必须执行额外的操作(添加esp,8和movzx edx,铝)

发布

string::运算符==()

  if (str1 == str2) 008533F0 cmp dword ptr [ebp-14h],10h 008533F4 lea eax,[str2] 008533F7 push dword ptr [ebp-18h] 008533FA cmovae eax,dword ptr [str2] 008533FE push eax 008533FF push dword ptr [ebp-30h] 00853402 push ecx 00853403 lea ecx,[str1] 00853406 call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0853B80h) 

string::比较()

  if (str1.compare(str2) == 0) 00853830 cmp dword ptr [ebp-14h],10h 00853834 lea eax,[str2] 00853837 push dword ptr [ebp-18h] 0085383A cmovae eax,dword ptr [str2] 0085383E push eax 0085383F push dword ptr [ebp-30h] 00853842 push ecx 00853843 lea ecx,[str1] 00853846 call std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0853B80h) 

这两个汇编代码都非常类似于编译器执行优化。

最后,在我看来,性能增益可以忽略不计,所以我真的会把它留给开发人员来决定哪一个是首选的,因为两者都达到相同的结果(特别是在发布版本的时候)。

如果string相等, compare()将返回false (well, 0 )。

所以不要轻易交换一个。

使用任何使代码更易读的方法。

compare()等同于strcmp()。 ==是简单的相等性检查。 compare()因此返回一个int==是一个布尔值。

如果你只是想检查string相等,使用==运算符。 确定两个string是否相等比find一个sorting(这是compare()给出的)要简单,所以在使用相等运算符的情况下,在性能上可能会更好。

较长的回答:API提供了检查string相等性的方法和检查stringsorting的方法。 您希望string相等,所以使用相等运算符(以便您的期望和库实现者的期望一致)。如果性能很重要,那么您可能想要testing两种方法并find最快的方法。

这里没有涉及的一件事是,它取决于如果我们比较string到Cstring,Cstring到string或string到string。

一个主要的区别是比较两个string的大小相等之前进行比较检查,这使得==运算符比比较更快。

这是比较,因为我看到它在g ++ Debian 7

 // operator == /** * @brief Test equivalence of two strings. * @param __lhs First string. * @param __rhs Second string. * @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise. */ template<typename _CharT, typename _Traits, typename _Alloc> inline bool operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs) { return __lhs.compare(__rhs) == 0; } template<typename _CharT> inline typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type operator==(const basic_string<_CharT>& __lhs, const basic_string<_CharT>& __rhs) { return (__lhs.size() == __rhs.size() && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(), __lhs.size())); } /** * @brief Test equivalence of C string and string. * @param __lhs C string. * @param __rhs String. * @return True if @a __rhs.compare(@a __lhs) == 0. False otherwise. */ template<typename _CharT, typename _Traits, typename _Alloc> inline bool operator==(const _CharT* __lhs, const basic_string<_CharT, _Traits, _Alloc>& __rhs) { return __rhs.compare(__lhs) == 0; } /** * @brief Test equivalence of string and C string. * @param __lhs String. * @param __rhs C string. * @return True if @a __lhs.compare(@a __rhs) == 0. False otherwise. */ template<typename _CharT, typename _Traits, typename _Alloc> inline bool operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs, const _CharT* __rhs) { return __lhs.compare(__rhs) == 0; } 

在Visual Studio 2012debugging器中,只有以下检查string时才能正常工作:

 strcmp(somestring.c_str(),"")==0 

返回true。

 somestring.compare("") 

返回1,和

 somestring=="" 

返回:没有运算符“==”匹配这些操作数。

 somestring.c_str()=="" 

返回:发生未指定的错误。

假设考虑两个strings和t。
给他们一些价值。
当使用(s == t)比较它们时,它会返回一个布尔值(true或false,1或0)。
但是当你使用s.compare(t)比较时,expression式返回一个值
(i) 0 – 如果s和t相等
(ii) <0 – 如果s中第一个不匹配的字符的值小于t的值,或者s的长度小于t的长度。
(iii) > 0 – 如果t中第一个不匹配的字符的值小于s的值,或者t的长度小于s的长度。