关于size_type

由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型.

string::size_type它在不同的机器上,长度是可以不同的,并非固定的长度。但只要你使用了这个类型,就使得你的程序适合这个机器。与实际机器匹配。
string::size_type从本质上来说,是一个整型数。关键是由于机器的环境,它的长度有可能不同。 例如:我们在使用 string::find的函数的时候,它返回的类型就是 string::size_type类型。而当find找不到所要找的字符的时候,它返回的是 npos的值,这个值是与size_type相关的。假如,你是用
string s;
     int rc = s.find( /*.....*/ );

然后判断,
if ( rc == string::npos )
这样在不同的机器平台上表现就不一样了。如果,你的平台的string::size_type的长度正好和int相匹配,那么这个判断会侥幸正确。但换成另外的平台,有可能 string::size_type的类型是64位长度的,那么判断就完全不正确了。 所以,正确的应该是:
string::size_type rc = s.find( /*.....*/ );


这个时候使用
if ( rc == string::npos )

就会正确了。

综上所述,在涉及对string长度操作时,应该用size_type,而不是int。但由于size_type是unsigned的,有一点需要小心,例如,反向遍历一个string

string str("ABC");
for(string::size_type i = str.size() - 1; i >= 0; i--)
         cout << str[i] << endl;

以上写法错误。由于i是unsigned的,所以i >= 0始终成立,为死循环。
正确的写法应该是利用反向迭代器:
for(string::reverse_iterator it = str.rbegin(); it != str.rend(); it ++)
          cout << *it << endl;


另外,反转一个string的比较简洁的写法:
string str("cvicses");
 string s(str.rbegin(),str.rend());
 cout << s <<endl;



你可能感兴趣的:(size_type)