最近在看标准库时碰到很多容易混淆的知识点:
vector源码实现中:
typedef size_t sizetype ;
typedef ptrdiff_t defference_type ;
就有以上这两句话,在C++ primer也总是看到这几种类型。
1.size_type类型
事实上size_type是一个无符号类型的值。
string::size_type 表示的是标准库中string类型的size()函数返回的的值,表示string对象的大小。
vector::size_type 表示的是标准库中vector容器的size()函数或capacity()函数返回的的值,表示vector对象中元素个数的大小或vector空间大小。
但是为什么不直接返回无符号类型的值呢?那是因为无符号类型的值在不同机器上的大小是不同的。
使用这个类型体现了标准库与机器无关的一个特性。还有其他标准数据库类型定义了配套的类型来解决这个问题。
2.difference_type类型
difference_type类型是与迭代器相关联的一个概念。
它表示指向同一个容器的两个迭代器之间的距离,显然它是一个有符号类型的。
3.size_t类型
size_t类型是在使用数组时碰到的一个类型。在使用数组下标时经常将其定义为size_t类型。size_t类型是一个与机器相关的无符号类型,它被设计得足够大以便能够表示内存中任意对象的大小。size_t类型是在cstddef头文件中定义的,这个文件是C标准库stddef.h头文件的C++语言版本。试想如果在遍历数组时只是定义为long,当数组中的元素远大于long表示的范围,那么确定能够保证便利到所有的数组中的所有元素吗?
sizeof()的返回类型就是size_t类型
4.ptrdiff_t类型
ptrdiff类型就两个指针相减返回的结果类型,ptrdiff_t类型也是在cstddef头文件中定义的一个与机器相关的类型,只是它是一个有符号类型。
5.constexpr类型
const expression的意思,把变量声明此类型由编译器来判断该变量值是否是一个常量表达式。
6.auto类型
让编译器帮助我们去分析表达式属于的类型,并可以使用表达式的值来初始化该变量。
7.decltype类型
返回表达式的类型。