vector <double> :: size_type vs. double </double>

时间:2014-03-27 03:09:56

标签: c++ vector

为什么要在vector<double>::size_type中使用for loop而不仅仅是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,但我仍然不确定。

2 个答案:

答案 0 :(得分:2)

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

如果你想要99%的解决方案,那么至少在gcc上,所有size_types都不过了 比size_t的typedef(这是一个unsigned int),所以你可以使用size_t。但是,明白 这可能会在将来发生变化,您的代码可能会停止工作或停止编译。

答案 1 :(得分:1)

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

可用于索引容器的可能值的范围出现了另一个问题。有不同的整数类型,如unsigned charshort,虽然它们自然适合索引的目的可能有一个远小于容器大小的范围,因此不能用于访问向量中的任何位置,有些可能具有非有效索引的值,例如-1。这两个都是double的问题:它可以表示作为索引没有意义的负值,并且它不能精确地表示uint64_t中的所有值(这是{{size_type的常见类型1位}在64位架构中。)

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