size_t不是容器概念,不是容器时,就用它。就有可移植性
size_type是容器概念,用于表示容器长度,没有容器不能使用。 是STL定义的
size_type:
由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型
string抽象意义是字符串, size()的抽象意义是字符串的尺寸, string::size_type抽象意义是尺寸单位类型
string::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 )就会正确了。
size_t
size_t的引入增强了程序在不同平台上的可移植性。size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。
它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。
经测试发现,在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。
size_t是为了方便系统之间的移植而定义的。(它就是一个无符号整型,有木有!!!)
在32位系统上定义为 unsigned int 更准确的说法是在32位系统上是32位无符号整型
在64位系统上定义为 unsigned long 在64位系统上是64位无符号整型
size_t 一般用来表示一种计数,比如有多少东西被拷贝等。所以,它在数组下标和内存管理函数之类的地方广泛使用
sizeof 操作符的结果类型是size_t,
例如:在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。
vector使用的下标实际也是size_t,源码是typedef size_t size_type。
因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。size_t类型通常用于循环,数组索引,大小的存储和地址运算。
其实size_t和size_type没有本质区别
例子
#include<iostream>
#include<vector>
using namespace std;
int main()
{
cout<<" typeid(size_t).name() = "<<typeid(size_t).name()<<endl;
cout<<" typeid(vector<int>::size_type).name() = "<<typeid(vector<int>::size_type).name()<<endl;
return 0;
}
网友评论