2013-04-06 72 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