2014-03-27 70 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意味着無論何時使用不同的實現構建程序,在不同的體系結構中或使用不同的編譯器時,它總是正確的索引類型。

相關問題