string::compare中的多余参数是什么意思?

4
C++参考手册中的string::compare中,有以下重载:
int compare ( size_t pos1, size_t n1, const string& str, size_t pos2, size_t n2 ) const;

这个函数有两个参数n1n2,在我看来它们应该始终相等,否则函数将返回一个等于trueintstring::compare返回值为0(false)表示字符串相等)。这正确吗?如果不是,请提供一个例子,展示一个比较不相等长度(n1 != n2)时会返回false的具体情况。

谢谢!


等等,一个等于“false”的“int”? - icecrime
@icecrime:一个 int 可以很容易地转换为 bool,这就是你可以使用 ifstrcmp 等的方法。 - rubenvb
是的,但是像 strcmp 一样,compare 不会返回布尔值,而是返回一个整数(就像它所说的那样)。对于相等的字符串,compare 返回一个整数值为0,在布尔上下文中评估为 false - eq-
@eq:好的,我的错误,但是字符串相等性仍然可以通过a.compare(b)进行测试。 - rubenvb
@ruvenb:我刚从本周的代码中删除了这样的用法,它显然不如a == b清晰,因此我认为当您真正关心排序时,最好使用compare - Matthieu M.
@Matthieu M.:那您建议使用 string::substringoperator== 代替 string::compare 吗? - rubenvb
3个回答

8

在我的眼中,应该始终是相等的或者函数返回一个等于false的int

比较是一种三值比较:负/零/正是重要的返回值类型,而不仅仅是true/false。如果字符串相等,则返回一个等于false的int,而不是它们不相等。

如果你正在按字典顺序排序不同长度的(子)字符串,compare会告诉你它们的顺序。

如果你只关心(子)字符串的相等性,那么不同的长度意味着不相等。作为一种优化,如果n1 != n2,则可以跳过调用compare


1
一个文档说: “返回值:如果操作数字符串小于参数字符串,则为负值;如果两个字符串相等,则为零;如果操作数字符串大于参数字符串,则为正值。”
所以它不仅仅是真或假。 例如:
操作数:“abc”,参数:“ab” 返回值:-1
操作数:“abc”,参数:“ad” 返回值:+1

1

n1n2参数是要比较的字符的最大数量。如果它们超过字符串的长度,std::compare函数将会修剪这些值。以下是一个示例,其中这些值不相等,函数返回0。

std::string a("AACAB");
std::string b("CAB");
std::cout << a.compare(2, 8, b, 0, 12) << '\n';

我不确定这个有什么用,但这是你所要求的特定情况。


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