67
const std::string::size_type cols = greeting.size() + pad * 2 + 2;

为什么string::size_typeint应该工作!它有数字!!!

4

3 回答 3

113

空头也持有数字。签名字符也是如此。

但是这些类型都不能保证足够大来表示任何字符串的大小。

string::size_type保证这一点。它是一种足以表示字符串大小的类型,无论该字符串有多大。

有关为什么需要这样做的简单示例,请考虑 64 位平台。一个 int 通常仍然是 32 位的,但你有远远超过 2^32 字节的内存。

因此,如果使用 (signed) int,您将无法创建大于 2^31 个字符的字符串。然而,size_type 在这些平台上将是一个 64 位值,因此它可以毫无问题地表示更大的字符串。

于 2009-07-25T03:06:07.990 回答
26

你给的例子,

const std::string::size_type cols = greeting.size() + pad * 2 + 2;

来自Koenig 的 Accelerated C++。在此之后,他还说明了他选择的原因,即:

std::string 类型将 size_type 定义为适当类型的名称,用于保存字符串中的字符数。每当我们需要一个局部变量来包含字符串的大小时,我们应该使用 std::string::size_type 作为该变量的类型。

我们给 cols 一个 std::string::size_type 类型的原因是为了确保 cols 能够包含问候语中的字符数,无论这个数字有多大。我们可以简单地说 cols 的类型是 int,实际上,这样做可能会奏效。但是,cols 的值取决于程序输入的大小,我们无法控制输入的长度。可以想象,有人可能会给我们的程序一个太长的字符串,以至于一个 int 不足以包含它的长度。

于 2013-10-21T05:44:37.107 回答
7

嵌套size_typetypedef 是 STL 兼容容器的要求(std::string恰好是),因此通用代码可以选择正确的整数类型来表示大小。

在应用程序代码中使用它是没有意义的, asize_t完全可以(int不是,因为它已签名,并且您将收到已签名/未签名的比较警告)。

于 2009-07-25T08:51:37.920 回答