空头也有数字.和签名的char一样.
但是这些类型都不能保证足够大以表示任何字符串的大小.
string::size_type
保证就是这样.它是一个足以表示字符串大小的类型,无论字符串有多大.
有关为什么需要这样做的简单示例,请考虑使用64位平台.int通常仍然是32位,但你有超过2 ^ 32字节的内存.
因此,如果使用(带符号)int,则无法创建大于2 ^ 31个字符的字符串.但是,size_type在这些平台上将是64位值,因此它可以代表更大的字符串而不会出现问题.
空头也有数字.和签名的char一样.
但是这些类型都不能保证足够大以表示任何字符串的大小.
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能够包含greeting中的字符数,无论这个数字有多大.我们可以简单地说cols有int类型,事实上,这样做可能会起作用.但是,cols的值取决于程序输入的大小,我们无法控制输入的长度.可以想象,有人可能会给我们的程序一个字符串,以至于int不足以包含它的长度.
嵌套的size_type
typedef是STL兼容容器(std::string
恰好是)的要求,因此通用代码可以选择正确的整数类型来表示大小.
在应用程序代码中使用它没有意义,size_t
完全int
没问题(不是,因为它已签名,您将获得签名/未签名的比较警告).