我有一个问题:
假设有两个std::string
,我想比较它们,可以选择使用compare()
类的string
函数,但我也注意到它是可能的使用简单的< > !=
运算符(即使我不包含<string>
库,这两种情况都是可能的)。
如果可以使用简单的运算符进行比较,有人可以解释为什么存在compare()
函数吗?
btw我使用Code :: Blocks 13.12 这是我的代码示例:
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main()
{
string temp1, temp2;
cout << "Enter first word: ";
getline (cin,temp1);
cout << "Enter second word: ";
getline (cin,temp2);
cout << "First word: " << temp1 << endl << "Second word: " << temp2 << endl;
if (temp1 > temp2)
{
cout << "One" << endl;
}
if (temp1.compare(temp2) < 0)
{
cout << "Two" << endl;
}
return 0;
}
答案 0 :(得分:25)
.compare()
返回一个整数,它是两个字符串之间差异的度量。
0
表示两个字符串比较相等。 operator==
只返回一个布尔值,表示字符串是否相等。
如果您不需要额外的细节,也可以使用==
。
答案 1 :(得分:3)
string cat = "cat";
string human = "human";
cout << cat.compare(human) << endl;
此代码将给出-1作为结果。这是由于比较字符串的第一个不匹配字符&#39; h&#39;较低或出现在&#39; c&#39;按字母顺序排列,即使比较字符串,“人类”也是如此。比猫还要长。
我发现cplusplus.com中描述的返回值更准确,它们是 - :
0:他们比较相等
&lt; 0:不匹配的第一个字符的值在比较字符串中较低,或者所有比较的字符匹配但比较的字符串较短。
大于0:比较字符串中不匹配的第一个字符的值更大,或者所有比较的字符匹配但比较的字符串更长。
此外,IMO cppreference.com的描述更简单,到目前为止最符合我自己的经验。
负值如果
如果两个字符序列都比较等价,则*this
出现在参数指定的字符序列之前,则按字典顺序为零
正值如果
*this
出现在参数指定的字符序列之后,则按字典顺序
答案 2 :(得分:1)
关于问题,
“如果可以使用简单的操作数进行比较,有人可以解释为什么存在
compare()
函数吗?
相对于<
和==
,compare
函数在概念上更简单,并且在实践中可以更高效,因为它避免了每个项目的两次比较普通的物品订购。
作为简单的一个例子,对于小整数值,您可以编写如下的比较函数:
auto compare( int a, int b ) -> int { return a - b; }
效率很高。
现在是一个结构
struct Foo
{
int a;
int b;
int c;
};
auto compare( Foo const& x, Foo const& y )
-> int
{
if( int const r = compare( x.a, y.a ) ) { return r; }
if( int const r = compare( x.b, y.b ) ) { return r; }
return compare( x.c, y.c );
}
相对而言,试图用<
直接表达这种词典比较,结果是可怕的复杂性和低效率。
使用C ++ 11时,为简单起见,普通的基于比较的词典比较可以非常简单地在元组比较中实现。