起因:
在一道算法题目中,vector.size() == 0
,计算vector.size() - 1
后的结果为18446744073709551615
。
原因:
vector.size()
的数据类型并不是 int
,而是 unsigned
。
通过 typeid().name()
,得出 vector.size()
的数据类型应该是 unsigned long
类型。
所以 vector.size()
为无符号类型,即使 vector.size()
为0,vector.size() - 1
自然不会是负数。在 64 位操作系统中,unsigned long
的字节为 8 字节,一个字节占 8 位,所以 unsigned long
占 64 位,
而 18446744073709551615 = 2^64 - 1
,所以 vector.size() - 1 = (unsigned long)(0 - 1) = 18446744073709551615
。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> a;
cout << a.size() << endl;
cout << typeid(a.size()).name() << endl;
cout << typeid(a.size() - 1).name() << endl;
return 0;
}
结果:
0
m // m表示为unsigned long类型
m
解决:
要想解决这个问题其实很简单,将 vector.size() 根据需要强制转换为 有符号数(int、long等) 即可。