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

Why doesn't std::vector use an offset?

本文关键字:偏移量 std vector 为什么      更新时间:2023-10-16

真的是简单的问题。在向量前面添加或删除矢量时,为什么需要移动所有元素以适应此更改?使用偏移量来修改索引到向量时给出的索引将解决此问题。当然,这可能会导致内存中(最多)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连续的其他要求。

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

该标准为您需要的场景提供了deque:容器前/后部的快速推/弹出。