2013-04-06 71 views
0

我有一個程序,在這個程序中我需要做一個deque足夠長的時間來保存某個索引處的項目。我用下面的循環,擴大deque爲什麼一個deque的大小會少於一個小數?

while(int1+deque1.size()<=int2){ 
    deque1.push_back(0); 
} 

當兩個int1int2-1(以及其他許多情況下,這是一個我注意到在調試時),deque1成長爲一個可怕的尺寸(幾十萬的項目),但循環不斷。爲什麼是這樣?

+1

打開警告。 – chris 2013-04-06 19:30:25

+1

'deque1.size()'返回一個無符號類型的值 – 2013-04-06 19:30:52

+4

順便說一下,'std :: deque'有一個'resize()'函數。 – chris 2013-04-06 19:32:16

回答

1

deque :: size()返回一個unsigned long int,因此int1和int2必須是正數,否則你會得到一個溢出。

這是編譯器自動生成的代碼。

while(static_cast<unsigned long>(int1)+deque1.size()<=static_cast<unsigned long>(int2)){ 
deque1.push_back(0); 
} 

因此,如果(例如)INT1是一個8位的無符號整數,並且你給它的值-1,就會變成(2^8 - 1 = 255)。這就是位編碼在計算機中的工作原理。

的解決方案可能是以下幾點:

while(int1+static_cast<ptrdiff_t>(deque1.size())<=int2){ 
deque1.push_back(0); 
} 

乾杯。

+0

'長'是一個壞主意,我爲你解決了。 – Mehrdad 2013-04-06 21:17:54

+0

@Mehrdad你能解釋爲什麼嗎? – 2013-04-06 21:29:50

+0

因爲它不可能足夠大以避免數據丟失。在64位系統上,「long」可以是32位(例如Visual C++),而「ptrdiff_t」是64位。使用'long'會導致截斷並導致你得到無效的答案。 'ptrdiff_t'是最好的選擇,因爲它必須能夠表示'距離(開始,結束)',這是大小。 – Mehrdad 2013-04-06 23:09:30