const std::string::size_type cols = greeting.size() + pad * 2 + 2;
为什么
string::size_type
? int
应该可以工作!它有数字!!!
空头也能持有数字。就像签名字符一样。
但是这些类型都不能保证足够大来表示 any 字符串的大小。
string::size_type
保证了这一点。它是一种足以表示字符串大小的类型,无论该字符串有多大。
举一个简单的例子来说明为什么这是必要的,请考虑 64 位平台。 int 通常仍然是 32 位,但你的内存远远超过 2^32 字节。
因此,如果使用(有符号)int,您将无法创建大于 2^31 个字符的字符串。 然而,size_type 在这些平台上将是 64 位值,因此它可以毫无问题地表示更大的字符串。
你给出的例子,
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 不足以包含其长度。
size_type
typedef 是 STL 兼容容器的要求(
std::string
恰好是),因此通用代码可以选择正确的整数类型来表示大小。在应用程序代码中使用它是没有意义的,
size_t
完全可以(
int
不是,因为它已签名,你会收到签名/未签名的比较警告)。