首页 新闻 会员 周边

C++中size_type 和 size()的用法,以及相应的区别?

0
悬赏园豆:5 [已解决问题] 解决于 2012-05-19 10:10

C++中size_type 和 size()的用法,以及相应的区别?这两个比较迷糊,请解释一下,谢谢……

waynewuzhenbo的主页 waynewuzhenbo | 初学一级 | 园豆:189
提问于:2012-04-29 08:21
< >
分享
最佳答案
2

sizt_t是C++的一个标准的typedef.全局有效,定义在全局名称空间中
size_type是STL定义的,只在namespace std中有效

VC6中定义size_t为typedef unsigned int size_t
size_type应该是C++为例如string类和许多其他库类型定义的配套类型,使这些库类型的使用与机器无关,一般定义为unsigned类型(例如unsigned int unsigned long)用法如下:

 容器名字::size_type

std::string::size_type index

是string 类型中的  size_type 类型  是一种整型  一般用于数组大小  string[std::string::size_type]

string::size_type类型

从逻辑上来讲,size()成员函数似乎应该返回整型数值,或如2.2节“建议”中所述的无符号整数。但事实上,size操作返回的是string::size_type类型的值。我们需要对这种类型做一些解释。

string类类型和许多其他库类型都定义了一些伙伴类型(companion types)。这些伙伴类型使得库类型的使用是机器无关的(machine-independent)。size_type就是这些伙伴类型中的一种。它定义为与unsigned型(unsigned int或unsigned long)具有相同的含义,而且可以保证足够大可存储任意string对象的长度。为了使用由string类型定义的size_type类型,程序员必须加上作用域操作符来说明所使用的size_type类型是由string类定义的。

C++中的size_t与size_type - 小憩一杯茶 - 小憩一杯茶任何存储string的size操作结果的变量必须为string::size_type类型。特别重要的是,不要把size的返回值赋给一个int变量。

虽然我们不知道string::size_type的确切类型,但可以知道它是unsigned型(2.1.1节)。对于任意一种给定的数据类型,它的unsigned型所能表示的最大正数值比对应的signed要大一倍。这个事实表明size_type存储的string长度是int所能存储的两倍。

使用int变量的另一个问题是,有些机器上int变量的表示范围太小,甚至无法存储实际并不长的string对象。如在有16位int型的机器上,int类型变量最大只能表示32767个字符的string对象。而能容纳一个文件内容的string对象轻易就会超过这个数字。因此,为了避免溢出,保存一个string对象size的最安全的方法就是使用标准库类型string:: size_type。

string类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能和机器无关(machine-independent)。string::size_type定义为unsigned型,可以保证足够大的存储string对象的长度。

注意,任何存储string的size操作结果的变量必须为string::size_type类型。尤其不能把size的返回值赋给一个int变量。(因为size返回的是一个unsigned类型,而int是signed类型。size能表达的大小是int的2倍)。

string str("some string");   //通过字符串字面值赋值给串
for (string::size_type ix = 0; ix != str.size(); ++ix)   //此处不该为int     用!=,而不用<=
{
   cout<<str[ix]<<endl;
}

vector<int> ivec;
for(vector<int>::iterator ix = ivec.begin(); ix != ivec.end(); ++ix)   
                                                                        //此处不该为int     用!=,而不用<=

{
    *ix = 0; //将各个元素赋值为0

}

收获园豆:5
悟行 | 专家六级 |园豆:12559 | 2012-04-29 09:18

谢谢,我的水平还不能完全看懂,继续努力……

waynewuzhenbo | 园豆:189 (初学一级) | 2012-05-19 10:09
其他回答(1)
0

楼上回答完美

Rollen Holt | 园豆:210 (菜鸟二级) | 2012-04-30 22:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册