【发布时间】:2010-11-13 22:38:31
【问题描述】:
const std::string::size_type cols = greeting.size() + pad * 2 + 2;
为什么是string::size_type? int 应该可以工作!它有数字!!!
【问题讨论】:
const std::string::size_type cols = greeting.size() + pad * 2 + 2;
为什么是string::size_type? int 应该可以工作!它有数字!!!
【问题讨论】:
空头也持有数字。签名字符也是如此。
但是这些类型都不能保证足够大来表示任何字符串的大小。
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;
来自Accelerated C++ by Koenig。在此之后他还说明了他选择的原因,即:
std::string 类型将 size_type 定义为 用于保存字符串中字符数的适当类型。每当我们需要本地 要包含字符串大小的变量,我们应该使用 std::string::size_type 作为该变量的类型。
我们给 cols 一个 std::string::size_type 类型的原因是 确保 cols 能够包含字符数 在问候中,无论这个数字有多大。我们可以简单地 说过 cols 的类型是 int,实际上,这样做可能会 工作。但是,cols 的值取决于输入的大小 我们的程序,我们无法控制输入的时间。 可以想象有人会给我们的程序这么长的字符串 一个 int 不足以包含它的长度。
【讨论】:
嵌套的size_type typedef 是 STL 兼容容器的要求(std::string 恰好是),因此通用代码可以选择正确的整数类型来表示大小。
在应用程序代码中使用它是没有意义的,size_t 完全可以(int 不是,因为它已签名,并且您会收到已签名/未签名的比较警告)。
【讨论】:
size_t。或者对于今天的大多数实际情况,您可以使用size_t。但如果没有意义,size_type 就不会存在了,不是吗?
size_t is 保证足够大,所以最多你“浪费”一些空间(在寄存器中或堆栈上)来使用大于-必要的价值。这些 typedef 用于通用代码,而不是在使用 std::string 时,这是一个具体的模型。也就是说,如果您在使用任意basic_string 的模板函数中,尤其是。对于任意的 allocator,您应该使用嵌套的 typedef。但是,是的,std::string 没有意义,因为size_t 完全没问题。
size_t 未签名。只要您与std::string::npos(而不是pos >= 0)进行比较,就可以了。