繁体   English   中英

string :: size_type而不是int

[英]string::size_type instead of int

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

为什么string::size_type int应该工作! 它持有数字!

空头也有数字。 和签名的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不是,因为它已经签名,你将获得签名/未签名的比较警告)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM