string :: size_type而不是int

时间:2009-07-25 03:04:01

标签: c++ string int size-type

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

为什么string::size_typeint应该有效!它拥有数字!!!

3 个答案:

答案 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不是,因为它已经签名,并且您将获得签名/未签名的比较警告)。