码迷,mamicode.com
首页 > 其他好文 > 详细

关于size_type

时间:2015-02-28 11:31:31      阅读:162      评论:0      收藏:0      [点我收藏+]

标签: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

标签:size_type

原文地址:http://blog.csdn.net/lc_910927/article/details/43982625

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!