笔记(一)——size_t 与 size_type 的区别
良好习惯:为了使程序有较好的移植性,尽量使用size_t
与size_type
代替unsigned
size_t
size_t
是一种机器相关的无符号类型,它被设计得足够大以便能表示内存中任意对象的大小。在cstddef
头文件中定义了size_t
类型,这个文件时C标准库stddef.h
头文件的C++语言版本。
在使用数组下标的时候,通常就将其定义为size_t
类型。
size_type
C++中 string
类及大多数标准库类型都定义几种配套的类型。这些配套类型体现了标准库类型与机器无关的特性,类型size_type
就是其中之一。
使用方法:
string::size_type a = 111;
vector< int >::size_type b = 222;
string::size_type
是一个无符号类型的值,而且能足够存放下任何string
对象大小。同理其它标准库类型。所有用于存放string
类的size
函数返回值的变量,都应该是string::size_type
类型。
总结
size_t
是全局定义的类型;size_type
是STL类中定义的类型属性,用以保存任意string等对象的长度。size_t
与size_type
类型一般等效于unsigned int
,在不同机器长度可能不同:win32是4字节,win64是8字节。sizeof
操作符的返回值的类型也为size_t
。- 在用下标访问元素时,
string
使用string::size_type
作为下标类型,而数组下标的正确类型则是size_t
。
其它
difference_type
// text 必须是有序的
// beg 和 end 表示我们搜索范围
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg) / 2; // (end - beg)就是defference_type类型
//当还有元素尚未检查并且我们还有没有找到sought时执行循环
while (mid != end && *mid != sought) {
if (sought < *mid) //要找的元素在前半部分吗?
end = mid; //如果是,调整搜索范围使得忽略掉后半部分
else //要找的元素在后半部分
beg = mid + 1; //在mid之后寻找
mid = beg + (end - begin) / 2; //新的中间点
C++中,只要两个迭代器指向的是同一个容器中的元素或者尾元素的下一个位置,就能将其相减,所得结果是两个迭代器的距离(迭代器的加法运算不存在)。距离指的就是右侧迭代器向前移动多少位置就能追上左侧的迭代器,其类型是名为difference_type
的带符号整型数,string
和 vector
都定义了difference_type
,因为这个距离可正可负,所以difference_type
是带符号类型的。
ptrdiff_t
constexpr size_t sz = 5;
int arr[sz] = {1, 2, 3, 4, 5};
auto n = end(arr) - begin(arr); // n 的值表示arr 数组中的元素个数
//begin 函数返回指向arr首元素的指针,end 函数返回指向 arr 尾元素下一位置的指针。
该例中,两指针相减的结果的类型是一种名为ptrdiff_t
的标准库类型,和 size_t
一样,
ptrdiff_t
也是一种定义在cstddef
头文件中的机器相关的类型。因为差值可能为负值,所以
ptrdiff_t
是一种带符号类型。