首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么string::compare返回一个int?

为什么string::compare返回一个int?
EN

Stack Overflow用户
提问于 2013-03-11 20:25:31
回答 3查看 8.5K关注 0票数 102

为什么string::compare返回int而不是shortchar这样的较小类型?我的理解是这个方法只返回-1、0或1。

第二部分,如果我要设计一个比较方法来比较两个Foo类型的对象,并且我只想返回-1、0或1,那么使用shortchar通常是一个好主意吗?

编辑:我已经更正了,string::compare不返回-1、0或1,它实际上返回一个>0、<0或0的值。谢谢你们让我排好队。

答案似乎大致是,没有理由返回一个小于int的类型,因为返回值是“rvalue”,而那些“rvalue”不会从小于int类型(4字节)中受益。此外,许多人指出,大多数系统的寄存器可能无论如何都会是int大小,因为无论你给它们一个1,2或4字节值,这些寄存器都会被填满,所以返回一个更小的值并没有什么实际的好处。

编辑2:事实上,当使用较小的数据类型(如对齐、掩码等)时,看起来可能会有额外的处理开销。一般的共识是,当处理大量数据时,较小的数据类型存在以节省内存,就像在数组的情况下一样。

今天学到了一些东西,再次感谢大家!

EN

回答 3

Stack Overflow用户

发布于 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();
}
票数 41
EN

Stack Overflow用户

发布于 2013-03-11 20:33:03

假设有些人正在将代码从C更改为C++。他们决定将strcmp替换为string::compare

因为strcmp返回int,所以更容易通过string::compare返回int作为礼物。

票数 4
EN

Stack Overflow用户

发布于 2013-03-11 20:31:42

可能是为了让它更像strcmp,它也有这个set of return values。如果您想要移植代码,那么使用尽可能接近的替换可能会更直观。

此外,返回值不仅是-101,还包括<00>0

此外,正如前面提到的,由于返回值受integral promotion的约束,因此将其缩小是没有意义的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15338526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档