为啥他使用“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<double>::size_type vec_sz;
这样他就不必将下一个命令写为vector<double>::size_type size = homework.size;
,但我的问题是他为什么不直接将size
声明为整数?
int size = homework.size;
这是因为我们使用了向量吗?
如果是这样,是否意味着向量迭代器返回的值不能存储在常规变量中?
【问题讨论】:
问你一个问题:vector<double>::size_type
后面的类型是什么?
简短的回答是作者可以并且可能应该使用size_t
,但这与int
不相同(它通常 与unsigned int
或unsigned long
相同;它的无符号性非常重要,并且大小差异也可能很重要,具体取决于您在做什么)。即使对于实际的答案框,长答案也太长了;一本好 C++ 书实际上会解释int
与size_t
与container<T>::size_type
的交易,但听起来你的没有。
关键是我们不知道std::vector<double>::size_type
背后的确切类型,但无论它是什么类型,我们都需要一种简写方式来声明它。它不太可能是int
顺便说一句。我们确实知道它是一种可以容纳足够大的数字以处理 vector 中元素的最大数量的类型。
"但我的问题是,他为什么不直接将 size 声明为整数?" -- 他做到了。 int
和vector<double>::size_type
是整数类型。不要将“整数”(类型的集合)与 int
(该集合中的一个特定类型)混淆。
@zwol 使用 size_type 比使用 size_t 有什么好处?
【参考方案1】:
他为什么不直接将大小声明为整数?
因为整数不是存储向量大小的正确类型,原因有两个:
int
允许为负数;向量的大小是非负的
即使是无符号 int
也可能不足以容纳最大向量大小
int
适用于小向量,但对于一般方法,您应该使用 vector<T>::size_type
。请注意,该类型是无符号的,因此在通过索引从前向后迭代时需要小心。
这是否意味着向量迭代器返回的值不能存储在常规变量中?
迭代器不是vector<T>::size_type
类型,它完全是独立的数据类型。
【讨论】:
所以本质上我们使用 size_type 是因为它能够容纳比 unsigned int 更大的尺寸?如果我正确阅读了您的回复。 @OlaniyiJinadu 是的,本质上就是这样。如果使用vector的typedef,则不必担心索引是否适合。【参考方案2】:首先,std::vector::size_type
不是int
。
无符号整数类型(通常为
std::size_t
)
和
std::size_t
是sizeof
运算符以及sizeof...
运算符和alignof
运算符(C++11 起)的结果的无符号整数类型。
其次,从c++11开始可以使用auto specifier
自动推断类型。
auto size = homework.size();
顺便说一句:homework.size
看起来很奇怪,你可能是指homework.size()
。
【讨论】:
以上是关于为啥他使用“typedef vector<double>::size_type”而不是使用“int”的主要内容,如果未能解决你的问题,请参考以下文章
以后面试官问你 为啥不建议使用Select *,请你大声回答他!
为啥我的网站的谷歌地图部分只有在用户删除他/她的 cookie 时才会更新?