c++中使用std::string::compare比较字符串


我有一个问题:

假设有两个std::string s,我想比较它们,可以选择使用string类的compare()函数,但我也注意到可以使用简单的< > !=运算符(即使我不包括<string>库,这两种情况都是可能的)。如果可以使用简单的操作符进行比较,有人能解释为什么compare()函数存在吗?

顺便说一句,我使用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;
}    

.compare()返回一个整数,表示两个字符串之间的差值。

  • 返回值0表示两个字符串比较为相等。
  • 为正值表示比较的字符串更长,或者第一个不匹配的字符更大。
  • 负值表示比较的字符串较短,或者第一个不匹配的字符较低。

operator==只是返回一个布尔值,表示两个字符串是否相等。

如果你不需要额外的细节,你也可以直接使用==

string cat = "cat";
string human = "human";
cout << cat.compare(human) << endl; 

此代码将给出-1作为结果。这是由于比较字符串'h'的第一个不匹配字符在字母顺序上较低或出现在'c'之后,即使比较字符串'human'比'cat'长。

我发现在cplusplus.com中描述的返回值更准确,它们是-:

0:它们比较相等

<0:比较字符串中第一个不匹配的字符的值较低,或者所有比较的字符都匹配,但比较的字符串较短。>

>大于0:比较字符串中第一个不匹配的字符的值大于0,或者所有比较的字符都匹配,但比较的字符串更长。

此外,IMO的cppreference.com的描述更简单,迄今为止最能描述我自己的经历。

如果*this以字典顺序出现在参数指定的字符序列之前,

为负值

为零,如果两个字符序列比较相等

如果*this以字典顺序出现在参数指定的字符序列之后,则

为正值

关于问题

有人能解释为什么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中,为了简单起见,普通的基于小于比较的字典比较可以非常简单地实现为元组比较。

最新更新