string::size_type

heaven33 2009-07-23 09:49:49
看c++ primer 讲string 类的时候 说 string的 size()方法返回的是string::size_type类型,说这是一些配套类型,通过这些配套类型,库类型的使用就能与机器无关。

请问为什么与机器无关呢? 对这句话不是很了解,高手给解释一下吧。
...全文
622 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
njnuxj 2010-03-03
  • 打赏
  • 举报
回复
学习了,领教了,呵呵
yjpa7 2009-12-20
  • 打赏
  • 举报
回复
学习了,谢谢
大牛~Daniel 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yyyapple 的回复:]
使用库是在相对于不同的机器环境来说更高一级的抽象

string抽象意义是字符串,
size()的抽象意义是字符串的尺寸,

string::size_type抽象意义是尺寸单位内型

不管实际机器存储类型是什么样的,size_type在底层的实现始终都可以与实际机器匹配,用户在使用时只需要关注其抽象意义,而不用理会更底层的细节,所以与机器无关
[/Quote]
同意1楼

简单讲就是用软实现,打个比方:假如你用的是32位机,int是4个字节,现在有另一台机是64位的,int是8个字节(我是说假如),这就是与机器有关;但是我为了保持兼容性,不想int变为8字节,那怎么办呢?那我可以用程序来实现,我定义一种类型或函数使得int不管在32位机还是64位机上都是4字节。这样就是与机器无关咯。
wwwzyb2002 2009-07-23
  • 打赏
  • 举报
回复
学习下
herman~~ 2009-07-23
  • 打赏
  • 举报
回复
学习
yangyunzhao 2009-07-23
  • 打赏
  • 举报
回复
这个得从c++标准说起了。
当时委员会的那帮人定义short int long等的时候,并没有规定int一定是4字节。也就是说int类型在这台机器上的表示范围可能与另外一台机器不一样。这会造成代码不可移植。

后来在制定c++标准的时候,引入stl。就定义了一套任何平台都必须一样的类型,比如你这个string::size_type。至于它的具体实现,应该说很简单。
打个比方啊:它可以先sizeof int一下,根据结果,然后#define string::size_type int或long。
这样你写的代码就稍微具有一个点点可移植性了。
[Quote=引用楼主 heaven33 的回复:]
看c++ primer 讲string 类的时候 说 string的 size()方法返回的是string::size_type类型,说这是一些配套类型,通过这些配套类型,库类型的使用就能与机器无关。

请问为什么与机器无关呢? 对这句话不是很了解,高手给解释一下吧。
[/Quote]
LeonTown 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 heaven33 的回复:]
看c++ primer 讲string 类的时候 说 string的 size()方法返回的是string::size_type类型,说这是一些配套类型,通过这些配套类型,库类型的使用就能与机器无关。

请问为什么与机器无关呢? 对这句话不是很了解,高手给解释一下吧。
[/Quote]

这个似乎有些类似于,微软定义的某些类型。
例如:WORD等;
就是,保证这些类型,在不同位数的机器上,都有同样的位长。
pengzhixi 2009-07-23
  • 打赏
  • 举报
回复
你去看下 size_type的具体定义就知道了。
taodm 2009-07-23
  • 打赏
  • 举报
回复
楼主啊,你得先回答,如果不返回size_type,那么你认为该返回什么?
yyyapple 2009-07-23
  • 打赏
  • 举报
回复
使用库是在相对于不同的机器环境来说更高一级的抽象

string抽象意义是字符串,
size()的抽象意义是字符串的尺寸,

string::size_type抽象意义是尺寸单位内型

不管实际机器存储类型是什么样的,size_type在底层的实现始终都可以与实际机器匹配,用户在使用时只需要关注其抽象意义,而不用理会更底层的细节,所以与机器无关
nwpulei 2009-07-23
  • 打赏
  • 举报
回复
学习
yangshun2008 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 billow_zhang 的回复:]
另外,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 )就回正确了。

这样解释,是不是你应该更理解与机器无关的意思啊?!


[/Quote]学习了
liuwg9999 2009-07-23
  • 打赏
  • 举报
回复
同意
[Quote=引用 9 楼 billow_zhang 的回复:]
1楼的解释是正确的。但是8楼的PenglueR朋友接着又添加的评论就不太对了。一般定义的int32_t这样的类型从名字上看来,就是固定的32位的整型数。如果8楼的朋友用来评论这个,倒是正确的。
而string::size_type并非如此。它在不同的机器上,长度是可以不同的,并非固定的长度。但只要你使用了这个类型,就使得你的程序适合这个机器。这就是1楼说的,与实际机器匹配的意思。
[/Quote]
billow_zhang 2009-07-23
  • 打赏
  • 举报
回复
另外,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 )就回正确了。

这样解释,是不是你应该更理解与机器无关的意思啊?!

billow_zhang 2009-07-23
  • 打赏
  • 举报
回复
1楼的解释是正确的。但是8楼的PenglueR朋友接着又添加的评论就不太对了。一般定义的int32_t这样的类型从名字上看来,就是固定的32位的整型数。如果8楼的朋友用来评论这个,倒是正确的。
而string::size_type并非如此。它在不同的机器上,长度是可以不同的,并非固定的长度。但只要你使用了这个类型,就使得你的程序适合这个机器。这就是1楼说的,与实际机器匹配的意思。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧