矢量<double>::size_type vs. 双倍

vector<double>::size_type vs. double

本文关键字:type vs 双倍 gt lt double 矢量 size      更新时间:2023-10-16

为什么要在for loop中使用vector<double>::size_type,而不仅仅是double?我以前从未真正弄乱过C++矢量,我正在阅读本网站关于它们的教程。作者将他们的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(声明为基元类型?我看到了这个老SO的帖子,但我仍然不确定。

如果希望代码可移植和可维护,则必须使用定义的size_type在要索引的容器中。

如果您想要99%的解决方案,那么目前,至少在gcc上,所有size_types都是而不是size_t的typedefs(这是一个无符号的int(,所以您可以使用size_t。但是,要明白这种情况将来可能会改变,您的代码可能会停止工作或停止编译。

基本类型可分为浮点型和算术型。浮点类型对索引建模来说真的很糟糕,因为它的主要目的是能够表示本质上不是积分的值。对一个值为1.75的向量进行索引会得到什么结果?要么在位置1或2索引到向量中,但在位置1.75没有对象。

可用于索引容器的可能值的范围会出现不同的问题。有不同的积分类型,如unsigned charshort,虽然它们自然适合索引的目的,但其范围可能远小于容器的大小,因此不能用于访问向量中的任何位置,有些可能具有无效索引值,如-1。这两者都是double的问题:它可以表示作为索引毫无意义的负值,并且不能精确地表示uint64_t中的所有值(这是64位架构中size_type的常见类型(。

标准库要求每个容器都提供一个嵌套类型(或typedef(,可用于对容器进行索引。这将是一个整数无符号类型,其大小足以引用容器中的任何元素。使用嵌套的typedef意味着,无论何时使用不同的实现、不同的体系结构或不同的编译器构建程序,它都将始终是正确的索引类型。