为啥他使用“typedef vector<double>::size_type”而不是使用“int”

Posted

技术标签:

【中文标题】为啥他使用“typedef vector<double>::size_type”而不是使用“int”【英文标题】:Why did he use "typedef vector<double>::size_type" instead of using "int"为什么他使用“typedef vector<double>::size_type”而不是使用“int” 【发布时间】:2016-04-20 01:47:01 【问题描述】:

我刚刚学习 C++,我正在使用 Accelerated C++。

在一个矢量示例中,作者使用了以下代码;

typedef vector<double>::size_type vec_sz;
vec_sz size = homework.size;

我知道typedef vector&lt;double&gt;::size_type vec_sz; 这样他就不必将下一个命令写为vector&lt;double&gt;::size_type size = homework.size;,但我的问题是他为什么不直接将size 声明为整数?

int size = homework.size;

这是因为我们使用了向量吗?

如果是这样,是否意味着向量迭代器返回的值不能存储在常规变量中?

【问题讨论】:

问你一个问题:vector&lt;double&gt;::size_type后面的类型是什么? 简短的回答是作者可以并且可能应该使用size_t,但这与int相同(它通常 与unsigned intunsigned long 相同;它的无符号性非常重要,并且大小差异也可能很重要,具体取决于您在做什么)。即使对于实际的答案框,长答案也太长了;一本 C++ 书实际上会解释intsize_tcontainer&lt;T&gt;::size_type 的交易,但听起来你的没有。 关键是我们不知道std::vector&lt;double&gt;::size_type 背后的确切类型,但无论它是什么类型,我们都需要一种简写方式来声明它。它不太可能是int 顺便说一句。我们确实知道它是一种可以容纳足够大的数字以处理 vector 中元素的最大数量的类型。 "但我的问题是,他为什么不直接将 size 声明为整数?" -- 他做到了。 intvector&lt;double&gt;::size_type 是整数类型。不要将“整数”(类型的集合)与 int(该集合中的一个特定类型)混淆。 @zwol 使用 size_type 比使用 size_t 有什么好处? 【参考方案1】:

他为什么不直接将大小声明为整数?

因为整数不是存储向量大小的正确类型,原因有两个:

int 允许为负数;向量的大小是非负的 即使是无符号 int 也可能不足以容纳最大向量大小

int 适用于小向量,但对于一般方法,您应该使用 vector&lt;T&gt;::size_type。请注意,该类型是无符号的,因此在通过索引从前向后迭代时需要小心。

这是否意味着向量迭代器返回的值不能存储在常规变量中?

迭代器不是vector&lt;T&gt;::size_type类型,它完全是独立的数据类型。

【讨论】:

所以本质上我们使用 size_type 是因为它能够容纳比 unsigned int 更大的尺寸?如果我正确阅读了您的回复。 @OlaniyiJinadu 是的,本质上就是这样。如果使用vector的typedef,则不必担心索引是否适合。【参考方案2】:

首先,std::vector::size_type 不是int

无符号整数类型(通常为std::size_t

std::size_tsizeof 运算符以及sizeof... 运算符和alignof 运算符(C++11 起)的结果的无符号整数类型。

其次,从c++11开始可以使用auto specifier自动推断类型。

auto size = homework.size();

顺便说一句:homework.size 看起来很奇怪,你可能是指homework.size()

【讨论】:

以上是关于为啥他使用“typedef vector<double>::size_type”而不是使用“int”的主要内容,如果未能解决你的问题,请参考以下文章

以后面试官问你 为啥不建议使用Select *,请你大声回答他!

为啥我的网站的谷歌地图部分只有在用户删除他/她的 cookie 时才会更新?

为啥一种方法比另一种更有效?

C# Cognex,为啥他说空引用异常 [重复]

python中构建了一个类,在定义了一个函数时为啥括号第一个self有啥用,为啥不能给他赋值

为啥 AJAX 优于 iFrame?