size_type和size_t

2020-06-29  本文已影响0人  棉花糖7

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;

}


上一篇 下一篇

猜你喜欢

热点阅读