为什么要在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,但我仍然不确定。
答案 0 :(得分:2)
如果您希望代码具有可移植性和可维护性,则必须使用定义的size_type 在容器中索引。
如果你想要99%的解决方案,那么至少在gcc上,所有size_types都不过了 比size_t的typedef(这是一个unsigned int),所以你可以使用size_t。但是,明白 这可能会在将来发生变化,您的代码可能会停止工作或停止编译。
答案 1 :(得分:1)
基本类型可分为浮点类型和算术类型。浮点类型对索引建模非常糟糕,因为主要目的是能够表示本质上不是整数的值。索引值为1.75的向量的结果是什么?您可以在位置1或2处索引向量,但在位置1.75处没有对象。
可用于索引容器的可能值的范围出现了另一个问题。有不同的整数类型,如unsigned char
或short
,虽然它们自然适合索引的目的可能有一个远小于容器大小的范围,因此不能用于访问向量中的任何位置,有些可能具有非有效索引的值,例如-1。这两个都是double
的问题:它可以表示作为索引没有意义的负值,并且它不能精确地表示uint64_t
中的所有值(这是{{size_type
的常见类型1位}在64位架构中。)
标准库要求每个容器提供可用于索引容器的嵌套类型(或typedef
)。这将是一个足够大的无符号类型,足以引用容器中的任何元素。使用嵌套的typedef
意味着无论何时使用不同的实现构建程序,在不同的体系结构中或使用不同的编译器,它都将是正确的索引类型。