2013-03-13 23 views
0

考慮此代碼:聲明在for循環的矢量運算

vector<double> student_grades(20); 

for (vector<double>::size_type i = 0; i < student_grades.size(); i++) 
{ 
    cout << i << endl; 
} 

恰恰是有關聲明i這種方式,而不是僅僅int i = 0不同是什麼?

+0

想想如果你有超過20億的學生需要處理會發生什麼。 – 2013-03-13 11:10:17

+0

這是原因:http:// stackoverflow。com/a/1181629/1663919 – 2013-03-13 11:11:03

+0

其他人給出的鏈接顯示它可以是一個無符號的整數,但也是一個長整數。差異不是由於矢量的大小。 – QuentinUK 2013-03-13 11:14:35

回答

2

什麼是完全不同的聲明我這種方式,而不是隻是int i = 0?

它可以確保適當的類型使用 - 你是假設vector<T>::size_type總是一樣int,但這種假設是不正確的。根據具體實施情況,它也可能類似於unsigned int,long,unsigned longsize_t

通過使用vector<T>::size_type,您的代碼在不同的實現中保持可移植性。請參閱vector<int>::size_type in C++

+0

現在有道理。謝謝你,先生。 – Saraph 2013-03-13 11:15:52

0

vector<T>::size_type是的static的成員。我不知道爲什麼有人會使用它,因爲我猜可能會導致混淆。看看here這個他已經在SO上回答了。

+0

你正在提議**不要**使用它?這與你的鏈接問題的答案是不是相反? – 2013-03-13 11:17:21

+0

我相信這是令人困惑的,無法理解它。但爲了進一步參考,我提供了鏈接。 – 2013-03-13 11:18:41

0

size_type是類型向量的(靜態)成員類型。通常, 它是std :: size_t的typedef,它本身通常是用於 unsigned int或unsigned long long的typedef。

Link to this question

標準集裝箱限定SIZE_TYPE作爲一個typedef到 分配器:: size_type的(分配器是模板參數),這對於 的std ::分配器被定義爲size_t型。

Link to this question

1

size_type是向量類,這給vector類的機會來決定使用什麼類型的索引裏面的typedef。 int具有2^31的最大值(通常但不是保證 - 我認爲它至少保證爲32767)。由於有時候我們想要的矢量大於20億項[我承認並不經常這麼做,我懷疑],這對類型本身來說是很有用的。

這種類型保證覆蓋vector實現本身可以應對的範圍。它不是太大[如果你選擇在32位系統上使用long long,它會比你需要的大,並且不會太小。當然,如果你知道你只有10件物品,那可能沒有關係。

它也幾乎總是一個無符號類型。在某些情況下,這使得索引數組效率更高,這也有助於提高性能。

+0

謝謝,相當不錯的解釋。 – Saraph 2013-03-13 11:22:32