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

27

我有一个问题:

假设有两个std::string字符串,我想比较它们,有使用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;
}    

有时候,拥有一个正数、零或负数更加有用。 - chris
3个回答

45

.compare()返回一个整数,该整数是两个字符串之间差异度量的结果。

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

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

如果您不需要额外的详细信息,您可以使用==


9
string cat = "cat";
string human = "human";

cout << cat.compare(human) << endl; 

这段代码将返回-1。这是由于被比较字符串的第一个不匹配字符'h'在字母顺序中低于或出现在'c'之后,即使被比较字符串'human'比'cat'更长。

我认为cplusplus.com中描述的返回值更加准确,它们分别是:

0:它们相等

<0:要么是所比较字符串中第一个不匹配的字符的值较低,要么是所有比较的字符都相同,但所比较字符串较短。

>0:要么是所比较字符串中第一个不匹配的字符的值较高,要么是所有比较的字符都相同,但所比较字符串较长。

此外,依据我的经验,cppreference.com的描述最简单清晰。

如果lexicographically(按字典顺序)指定的参数字符序列在*this之前,则返回负值

如果两个字符序列相等,则返回零

如果lexicographically(按字典顺序)指定的参数字符序列在*this之后,则返回正值


2
关于这个问题,"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,仅凭简单性,基于普通小于比较的词典比较可以非常简单地实现元组比较。

1
auto int f(int, int) -> int; 发抖。为什么要使用尾置返回类型? - rubenvb
@rubenvb:至今还没有人为使用两种不同的函数声明语法提出理由。我猜“shuffers”评论和无效声明意味着你对任何变化都有情感反应。但是,当一个语法足以满足需求时,我看不出使用两种不同语法的实用性。 - Cheers and hth. - Alf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接