string::size_type 而不是 int

问题描述 投票:0回答:4
const std::string::size_type cols = greeting.size() + pad * 2 + 2;

为什么

string::size_type
int
应该可以工作!它有数字!!!

c++ string int size-type
4个回答
116
投票

空头也能持有数字。就像签名字符一样。

但是这些类型都不能保证足够大来表示 any 字符串的大小。

string::size_type
保证了这一点。它是一种足以表示字符串大小的类型,无论该字符串有多大。

举一个简单的例子来说明为什么这是必要的,请考虑 64 位平台。 int 通常仍然是 32 位,但你的内存远远超过 2^32 字节。

因此,如果使用(有符号)int,您将无法创建大于 2^31 个字符的字符串。 然而,size_type 在这些平台上将是 64 位值,因此它可以毫无问题地表示更大的字符串。


26
投票

你给出的例子,

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 能够包含字符数 在问候语中,无论这个数字有多大。我们可以简单地 已经说过 cols 具有 int 类型,事实上,这样做可能会 工作。然而,cols 的值取决于输入的大小 我们的程序,我们无法控制输入的长度。 可以想象有人可能会给我们的程序一个这么长的字符串 int 不足以包含其长度。


7
投票
嵌套的

size_type

 typedef 是 STL 兼容容器的要求(
std::string
 恰好是),因此通用代码可以选择正确的整数类型来表示大小。

在应用程序代码中使用它是没有意义的,

size_t

完全可以(
int
不是,因为它已签名,你会收到签名/未签名的比较警告)。


0
投票
size_t 和 std::string::size_type 是相同的类型,除了一个重要的区别:如果它们都表示任意大小的值,则 std::string::size_type (std::string 的成员)使用的是 static常量值 -1 表示 npos。超过字符串末尾的一位。它告诉程序您已到达字符串的末尾。如果您正在对字符串使用搜索、查找、擦除、替换或任何其他修改操作,或者编写自己的操作,那么您可能更喜欢 std::string::size_type。如果您只是迭代字符串 size_t 可能没问题。

© www.soinside.com 2019 - 2024. All rights reserved.