size_type类型与size_t的异同

1.什么是size_type?

size_type 如同 int 、float等 一样也是一种数据类型,不同之处在于size_type会适应机器,不同的机器size_type会有不同的长度;只要你使用了这个类型,就使得你的程序适合这个机器。与实际机器匹配

size_type是由string类型 和 vector类型 定义的 类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型

vector v;
v.push_back(0);
v.push_back(0);
v.push_back(0);
v.push_back(0);
int i = v.size();

这样的代码在C++编译器编译时,会出现编译警告,这是因为vector::size()返回值类型是size_type的无符号整数,但是 int类型是有符号整数, = 号两边的类型并不匹配,所以会抛出警告

同时string::find()函数在查找字符串中的某一个字符时的返回值也是 size_type类型的,用size_type类型无论string对象多大,也不用担心越界的问题,同时 如果 在字符串中没有找到目标字符,则 find()会返回string::npos,它是与size_type类型相匹配的
所以如果我们定义

int pos = string.find('c',0);
if(pos == string::npos) 
{
	cout << "没有找到!!"<

//来判断是否找到,那么因为pos是int类型,而 string::npos是size_type类型,两者可能就会完全不同,程序出错

我们可以这样定义:

string::sizetype pos = string.find('c',0);
if(pos == string::npos) 
{
	cout << "没有找到!!"<

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

2.什么是size_t?

size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。
它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。
例如:我们常用的sizeof()操作的返回值就是 size_t类型的
例如:在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。
vector使用的下标实际也是size_t,源码是typedef size_t size_type。
因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。

为什么要有size_t类型?
在C++中,设计 size_t 就是为了适应多个平台的 。size_t的引入增强了程序在不同平台上的可移植性。size_t是针对系统定制的一种数据类型,一般是整型,因为C/C++标准只定义一最低的位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。一般这种类型都会定义到它具体占几位内存等。
例如:在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。

你可能感兴趣的:(STL)