为什么string::compare
返回int
而不是short
或char
这样的较小类型?我的理解是这个方法只返回-1、0或1。
第二部分,如果我要设计一个比较方法来比较两个Foo
类型的对象,并且我只想返回-1、0或1,那么使用short
或char
通常是一个好主意吗?
编辑:我已经更正了,string::compare
不返回-1、0或1,它实际上返回一个>0、<0或0的值。谢谢你们让我排好队。
答案似乎大致是,没有理由返回一个小于int
的类型,因为返回值是“rvalue”,而那些“rvalue”不会从小于int类型(4字节)中受益。此外,许多人指出,大多数系统的寄存器可能无论如何都会是int
大小,因为无论你给它们一个1,2或4字节值,这些寄存器都会被填满,所以返回一个更小的值并没有什么实际的好处。
编辑2:事实上,当使用较小的数据类型(如对齐、掩码等)时,看起来可能会有额外的处理开销。一般的共识是,当处理大量数据时,较小的数据类型存在以节省内存,就像在数组的情况下一样。
今天学到了一些东西,再次感谢大家!
发布于 2013-03-11 20:39:03
它有意不返回-1、0或1。
它允许(注意这不适用于字符串,但它同样适用于字符串)
int compare(int *a, int *b)
{
return *a - *b;
}
这比以下代码要简单得多:
int compare(int *a, int *b)
{
if (*a == *b) return 0;
if (*a > *b) return 1;
return -1;
}
如果你必须返回- 1,0或1,这就是你必须做的,或者类似的事情。
它也适用于更复杂的类型:
class Date
{
int year;
int month;
int day;
}
int compare(const Date &a, const Date &b)
{
if (a.year != b.year) return a.year - b.year;
if (a.month != b.month) return a.month - b.month;
return a.day - b.day;
}
在字符串的情况下,我们可以这样做:
int compare(const std::string& a, const std::string& b)
{
int len = min(a.length(), b.length());
for(int i = 0; i < len; i++)
{
if (a[i] != b[i]) return a[i] - b[i];
}
// We only get here if the string is equal all the way to one of them
// ends. If the length isn't equal, "longest" wins.
return a.length() - b.length();
}
发布于 2013-03-11 20:33:03
假设有些人正在将代码从C更改为C++。他们决定将strcmp
替换为string::compare
。
因为strcmp
返回int
,所以更容易通过string::compare
返回int
作为礼物。
发布于 2013-03-11 20:31:42
可能是为了让它更像strcmp
,它也有这个set of return values。如果您想要移植代码,那么使用尽可能接近的替换可能会更直观。
此外,返回值不仅是-1
、0
或1
,还包括<0
、0
或>0
。
此外,正如前面提到的,由于返回值受integral promotion的约束,因此将其缩小是没有意义的。
https://stackoverflow.com/questions/15338526
复制相似问题