size_type是unsigned类型
昨晚做杭电1002题,本以为简单的A+B问题,却也让我发现了一个问题,也算是一种收获吧,记在这里了。
第一次用STL做的,用string存放那两个大数,提交后通过,却看到编译器上有两个warning,"warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data".
大致意思是说,我用int类型表示string类型的size()函数的返回值,可能导致数据的丢失,因为int类型是可正可负的,而string::size_type是unsigned类型,所以表示正数的话,string::size_type
表示的范围肯定是比int范围要大的。看着下面有两个warning也不是很舒服,我就想把程序改下,就可以把两个可恶的warning去掉了,结果改后出现错误,说我访问了不该访问的内容,囧....
仔细debug后才知道,这就是int和string::size_type的区别啊,int可以取负值,而string::size_type不管你怎么减,它永远是正值,而我的程序中需要对string::size_type的对象一直减,直到减到它
小于零为止,这很明显就是一个死循环,因为string::size_type的对象不可能小于零。
写一个简单的程序说明情况:
#include <vector>
using namespace std;
int main()
{
vector<int>::size_type t = 1;
while(t >= 0)
--t;
cout<<t<<endl;
return 0;
}
这就是一个死循环,调试跟踪时发现,当t取完0后,再次--t后,t的值是4294967295,程序就会这样一直死循环下去。
也就是说,虽然C++ Primer中强调,为了避免溢出,保存一个string对象size的最安全的方法就是使用标准库类型string:: size_type(或者说保存一个vector对象最安全的方法就是使用vector<int>::size_type类型),但如果你的程序中需要对size_type类型执行减操作并且要把它减到小于零的话,还是不要管那些可恶的warning了,老老实实用int要更保证些。