迭代器相减得到整数的底层机制:为何结果为数值?是否为内置运算符?
vector迭代器相减的底层逻辑与常见疑问解答
1. 迭代器相减的底层到底做了什么?
vector的迭代器属于随机访问迭代器,说白了就是对数组指针的一层封装——毕竟vector的内存是连续分配的。当你把两个vector迭代器相减时,底层实际是在计算它们指向的内存地址差:用后一个迭代器的内存地址减去前一个的地址,再除以单个元素的字节大小,最终得到的就是两个迭代器之间隔了多少个元素。
拿你的代码举例,remove操作后返回的p指向处理完后第一个未被保留的元素(对应原vector里的第4个位置,按0开始索引是3),begin(v)指向第一个元素(索引0)。两者的地址差除以sizeof(int),结果正好是3。
2. 为什么相减结果是整数?
随机访问迭代器的相减操作,返回值是difference_type类型——这是C++标准定义的一种有符号整数类型(通常就是ptrdiff_t),专门用来表示两个迭代器之间的元素数量差。这个类型可以直接隐式转换成普通整数,所以用cout输出时就显示成了整数3。
3. 用的是内置“-”运算符吗?
不是内置的-,而是C++标准库为随机访问迭代器专门重载的operator-。只有支持随机访问的迭代器(比如vector、array的迭代器)才有这个重载,像list这种双向迭代器就不行——因为list的内存不连续,没法直接计算地址偏移。
内容的提问来源于stack exchange,提问作者Daniel Zaken
相关产品推荐
相关产品推荐

