2014-03-27 72 views
0

为什么要在for loop中使用vector<double>::size_type而不仅仅是,比如说double?我从来没有真正与C++载体混淆,而我正在阅读this website's tutorial on them。作者写道他们for loop如,vector <double> :: size_type与double

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,但我仍然不确定。

+1

'双'真的不是一个理想的循环计数器类型。 – chris

+1

因为'vector :: size_type!= double'(我猜它是'size_t') – FDinoff

+0

@FDinoff,它通常是'size_t',但是没有空格。 – chris

回答

2

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

如果你想要99%的解决方案,那么目前至少在gcc上,所有size_types都只是size_t(它是一个无符号整数)的typedefs,所以你可以使用size_t 。但是,了解 这可能会在将来更改,并且您的代码可能会停止工作或停止编译。

+0

这不是保证,它通常是'size_t',可能不是'unsigned int'。 – chris

+0

但是,为什么你不能只声明'unsigned int'呢?为什么连漫长的'矢量 :: size_type'都打扰? – Matt

+5

@Matt,后者确保你有一个可以存储所有有效索引的类型。 – chris

1

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

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

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

相关问题