不同字符串的.size()函数值相减

Subtracting .size() function values of different strings

最近我在尝试用 C++ 减去两个字符串的 .size() 值时遇到了一个问题。据我所知,size() returns 是一个字符串中的字符数。所以假设我有 2 个字符串 pqabs(p.size()-q.size()) 应该 return 我两个字符串的长度不同。但是当我 运行 这段代码时,它 return 突然变大了。当我单独打印两者的长度或者如果我将它们的长度值存储在不同的整数中并减去它们时,它们会给我正确的答案。我还不知道为什么。

std::string 成员函数 size() returns 一个无符号值,所以如果 p.size() < q.size(),表达式 p.size()-q.size() 将不会计算为负数(它是无符号,不能为负数),但(通常)非常大(无符号)数。

size() returns 一个无符号值。较小的无符号值减去较大的无符号值会导致计算下溢,从而导致较大的负值。把它想象成你在汽车里有一个英里或公里的 "rolling" 计数器,你回滚过去 0,它变成 99999,这是一个很大的数字。

假设您关心负面差异,解决方案是 static_cast<int>(p.size() - q.size())(并将其传递给 abs)。

Return size()的值是size_t的个数(一个无符号整数类型) 因此,如果您从较小的数字中减去较大的数字,您将遇到问题并由于减法而获得较大的值。

参考std::string::size

std::strings 将它们的大小报告为 unsigned 整数的某个宽度;这种类型有点像手表上的秒针:你可以将它从 0 向前上弦到 59,但如果你继续顺时针走,它会下降到 0,然后再次递增,而如果你逆时针上弦,你会倒数到 0,然后跳到59 并从那里倒数,无穷无尽。

假设您要从长度为 4 的弦中减去长度为 6 的弦,这很像是在说 "start the minute hand at 4 and wind counterclockwise by 6 minutes" - 当您倒回 4 分钟时,秒针已经在 0 处,您又上弦分钟达到 59,最后一分钟达到 58。对于 std::string::size_type,最大值不是 59 - 它要大得多 - 但问题是一样的。结果始终为正,因此不受 abs 的影响,但无论如何 - 不是您想要的!

实际的最大值可以在 #include <limits>std::numeric_limits<std::string::size_type>::max() 之后访问,不管它值多少。

有很多方法可以解决这个问题。 David Schwartz 对 Zola 的回答的评论列出了一个很好的答案:std::max(p.size(),q.size())-std::min(p.size(),q.size()),您可以将其视为 "subtract the smaller value from the larger value"。另一种选择是...

p.size() > q.size() ? p.size() - q.size() : q.size() - p.size()

...这意味着 "if p's larger, subtract q from it, otherwise subtract it (i.e. p) from q".