笔记(一)——size_t 与 size_type 的区别

笔记(一)——size_t 与 size_type 的区别

良好习惯:为了使程序有较好的移植性,尽量使用size_tsize_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类型。

总结

  1. size_t是全局定义的类型;size_type是STL类中定义的类型属性,用以保存任意string等对象的长度。
  2. size_tsize_type类型一般等效于unsigned int,在不同机器长度可能不同:win32是4字节,win64是8字节。sizeof操作符的返回值的类型也为size_t
  3. 在用下标访问元素时,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 的带符号整型数,stringvector都定义了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是一种带符号类型。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Balaaam

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值