const std::string::size_type cols = greeting.size() + pad * 2 + 2;
为什么string::size_type
? int
应该有效!它拥有数字!!!
答案 0 :(得分:96)
空头也有数字。和签名的char一样。
但是这些类型都不能保证足够大以表示任何字符串的大小。
string::size_type
保证这一点。它是一个足以表示字符串大小的类型,无论字符串有多大。
有关为何需要这样做的简单示例,请考虑使用64位平台。 int通常仍然是32位,但你有超过2 ^ 32字节的内存。
因此,如果使用(带符号)int,则无法创建大于2 ^ 31个字符的字符串。 但是,size_type在这些平台上将是64位值,因此它可以代表更大的字符串而没有问题。
答案 1 :(得分:23)
您已经提供的示例
const std::string::size_type cols = greeting.size() + pad * 2 + 2;
来自Accelerated C++ by Koenig。他还说明了他之后选择的原因,即:
std :: string类型将size_type定义为的名称 用于保存字符串中字符数的适当类型。每当我们需要一个当地人 变量包含字符串的大小,我们应该使用std :: string :: size_type作为该变量的类型。
我们给cols一个std :: string :: size_type类型的原因是 确保cols能够包含多少个字符 在问候中,无论这个数字有多大。我们可以简单 已经说cols有int类型,实际上可能这样做 工作。但是,cols的值取决于输入的大小 我们的程序,我们无法控制输入的时间长短。 可以想象有人可能会给我们的程序一个字符串这么久 int不足以包含其长度。
答案 2 :(得分:7)
嵌套size_type
typedef是STL兼容容器(std::string
恰好是)的要求,因此通用代码可以选择正确的整数类型来表示大小。
在应用程序代码中使用它没有意义,size_t
完全没问题(int
不是,因为它已经签名,并且您将获得签名/未签名的比较警告)。