C++: size_type与 size_t一些概念

区别

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

size_type是STL定义的,只在namespace std中有效

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

1
2
3
容器名字::size_type
std::string::size_type index

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

1
string::size_type类型

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

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

任何存储stringsize操作结果的变量必须为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对象的长度。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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
}

热评文章