c++ string::size_type而不是int

q8l4jmvw  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(81)
const std::string::size_type cols = greeting.size() + pad * 2 + 2;

字符串
为什么string::size_typeint应该工作!它保存数字!

ldxq2e6h

ldxq2e6h1#

一个short也包含数字。一个有符号的char也是。
但是这些类型都不能保证足够大以表示 any 字符串的大小。
string::size_type就是这样保证的。它是一个足够大的类型,可以表示一个字符串的大小,不管这个字符串有多大。
举一个简单的例子来说明为什么这是必要的,考虑64位平台。在这些平台上,int通常仍然是32位,但你有远远超过2^32字节的内存。
因此,如果使用(有符号)int,您将无法创建大于2^31个字符的字符串。然而,size_type在这些平台上将是64位值,因此它可以表示更大的字符串而没有问题。

bt1cpqcv

bt1cpqcv2#

你举的例子,

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

字符串
是来自Accelerated C++ by Koenig的,他还在后面说明了他选择的原因,即:
std::string类型将size_type定义为用于保存字符串中字符数的适当类型的名称。每当我们需要一个局部变量来包含字符串的大小时,我们应该使用std::string::size_type作为该变量的类型。
我们给reflect一个std::string::size_type类型的原因是为了确保reflect能够包含greeting中的字符数,不管这个数字有多大。我们可以简单地说reflect有int类型,事实上,这样做可能会起作用。然而,reflect的值取决于我们程序输入的大小,我们无法控制输入的长度。可以想象,有人可能会给我们的程序一个字符串太长,以至于int不足以包含它的长度。

5jdjgkvh

5jdjgkvh3#

嵌套的size_type typedef是STL兼容容器(std::string恰好是)的要求,因此泛型代码可以选择正确的整数类型来表示大小。
在应用程序代码中使用它是没有意义的,size_t是完全可以的(int不是,因为它是有符号的,你会得到有符号/无符号的比较警告)。

hi3rlvi2

hi3rlvi24#

size_t和std::string::size_type是相同的类型,除了一个重要的区别:它们都将表示任何大小的值,std::string::size_type(std::string的成员)使用-1的静态常量值来表示超过字符串结尾的npos. 1。它告诉程序已经到达字符串的结尾。如果你正在使用搜索,查找,删除,替换或任何其他修改字符串的操作,或者编写自己的操作,那么你可能希望使用std::string::size_type。如果你只是迭代字符串,size_t可能没问题。

相关问题