您的位置:首页 > 其它

string::size_type

2013-07-09 22:09 549 查看
size_type其实是string模板类定义的一种类型之一,它与size_of的用法相似,只是它根据存储的类型返回字符串的长度.对于 string具体化,将根据char返回字符串的长度,在这种情况下,size_type与size_of等效.size_of是一种无符号类型.

size_type实际上是做为解决string类设计上的严重失误而引入的。

size_type是在string类内定义的一个无符号整形类型,由于string类里很多方法的返回值都是size_type类型的,所以必须使用size_type进行类型声明。

如下:

string a= "abcdefg ";

string::size_type idx;

idx = a.find( "h "); //not found,return string::npos

if( idx == string::npos ) //check if not find

{

.....

}

由于npos为find返回的特殊值(-1),而不幸的是,size_type类型为unsigned int,所以

不同的编译器对npos的理解不同。

试想一下,用8字节来unsigned int 来表示-1和用4字节表示,值是完全不同的。

这可能是string类设计时的一个致命缺陷,为了兼容和可移植性,

特定义size_type类型,在不同编译器中,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 )就会正确了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: