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&lt;double&gt;::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&lt;double&gt;::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&lt;double&gt;::size_type @Matt,后者确保您拥有可以存储所有有效索引的类型。 如果您使用size_type,那么您的代码仍然适用于大小不同的不同编译器设置 size_t 是一个无符号的整数;不一定是unsigned int【参考方案2】:

基本类型可以分为浮点型和算术型。浮点类型对索引建模真的很糟糕,因为主要目的是能够表示本质上不是整数的值。索引值为 1.75 的向量会产生什么结果?您可以在位置 1 或 2 处对向量进行索引,但在位置 1.75 处没有对象。

一个不同的问题出现在可用于索引容器的可能值的范围内。有不同的整数类型,如unsigned charshort,虽然它们自然适合索引的目的,但它们的范围可能远小于容器的大小,因此不能用于访问向量中的任何位置,有些可能具有无效索引的值,例如 -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

opencv::meanStdDev 带有矢量<vector<double>>

使用“auto”代替 std::vector<double>*