vector<double>::size_type 与 double
Posted
技术标签:
【中文标题】vector<double>::size_type 与 double【英文标题】:vector<double>::size_type vs. double 【发布时间】:2014-03-27 03:09:56 【问题描述】:您为什么要在for loop
中使用vector<double>::size_type
而不仅仅是double
?我以前从来没有真正搞过C++
向量,我正在阅读this website's tutorial on them。作者将他们的for loop
写为,
for (vector<double>::size_type i = 0; i < 20; i++)
cout << "Enter marks for student #" << i+1
<< ": " << flush;
cin >> student_marks[i];
我可以看到它可以双向工作,但是为什么您会以上述方式使用它们,而不是简单地将您的计数器 (i
) 声明为原始类型?我看到了this older SO post,但我还是不确定。
【问题讨论】:
double
确实不是循环计数器的理想类型。
因为vector<double>::size_type != double
(我猜是size_t
)
@FDinoff,通常是size_t
,但可以不用。
【参考方案1】:
如果您希望您的代码具有可移植性和可维护性,则必须使用定义的 size_type 在要索引的容器中。
如果你想要 99% 的解决方案,那么目前,至少在 gcc 上,所有 size_types 仅此而已 比 size_t 的 typedefs (这是一个无符号整数),所以你可以使用 size_t。不过,明白 这可能会在未来发生变化,您的代码可能会停止工作或停止编译。
【讨论】:
这不能保证,通常是size_t
,可能不是unsigned int
。
但是你为什么不能直接声明unsigned int
呢?为什么还要打扰冗长的vector<double>::size_type
?
@Matt,后者确保您拥有可以存储所有有效索引的类型。
如果您使用size_type
,那么您的代码仍然适用于大小不同的不同编译器设置
size_t
是一个无符号的整数;不一定是unsigned int
。【参考方案2】:
基本类型可以分为浮点型和算术型。浮点类型对索引建模真的很糟糕,因为主要目的是能够表示本质上不是整数的值。索引值为 1.75 的向量会产生什么结果?您可以在位置 1 或 2 处对向量进行索引,但在位置 1.75 处没有对象。
一个不同的问题出现在可用于索引容器的可能值的范围内。有不同的整数类型,如unsigned char
或short
,虽然它们自然适合索引的目的,但它们的范围可能远小于容器的大小,因此不能用于访问向量中的任何位置,有些可能具有无效索引的值,例如 -1。这两个都是double
的问题:它可以表示作为索引没有意义的负值,并且它不能精确表示uint64_t
中的所有值(这是size_type
在64 位架构中的常见类型)。
标准库要求每个容器提供可用于索引容器的嵌套类型(或typedef
)。这将是一个完整的无符号类型,其大小足以引用容器中的任何元素。使用嵌套的typedef
意味着无论何时您使用不同的实现、不同的架构或不同的编译器构建程序,它始终是正确的索引类型。
【讨论】:
以上是关于vector<double>::size_type 与 double的主要内容,如果未能解决你的问题,请参考以下文章
使 double 和 std::vector<double> 协变
vector<double>::size_type 与 double
如何在初始化中将 'std::vector<double>' 转换为 'double'
带有 std::function<double(std::vector<double>) 回调的 cppyy