繁体   English   中英

为什么std :: vector不使用偏移量?

[英]Why doesn't std::vector use an offset?

简单的问题。 在向量的前面添加或删除时,为什么需要移动所有元素以适应此更改? 使用偏移来修改索引到向量时给出的索引将解决此问题。 当然,这可能导致(最多)内存中的2个连续数据块,但这似乎是为了将线性操作减少到恒定时间而付出的代价。

这是一个尽可能清晰的例子:

['A', 'B', 'C', _, _, _, _, _] offset is 0, 4th through 8th position unused.
push_front('M')
['A', 'B', 'C, _, _, _, _, 'M'] offset is -1

然后索引时

operator[](size_t index) {
    return backing_array[(index + offset) % size]
}

我明白这意味着可能没有一个纯粹的连续数据块,但从1移动到2似乎并不是一个巨大的交易,以换取恒定的时间推送和弹出前端。

我明白这意味着可能没有一个纯粹连续的数据块

不,这就是故事结尾 vector的全部意义在于它一个“纯粹的连续数据块”。 这是实施的基本要求。

执行此操作的能力是vector的整个目的的核心部分:

T *ptr = &vec[0];
ptr+1;
ptr == &vec[1];

因此,接口不能提供阻止vector连续的附加要求。

向量背后的整个想法是针对单个连续的数据块:例如,您可以将它们(好的,第一个元素的地址)传递给C API,获得良好的缓存局部性等。

本标准规定了deque 整整场景需要:快速推/流行的前/后的容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM