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

时间:2016-05-31 21:00:35

标签: c++ vector

真的很简单的问题。在向量的前面添加或删除时,为什么需要移动所有元素以适应此更改?使用偏移来修改索引到向量时给出的索引将解决此问题。当然,这可能会导致(最多)内存中的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并不是一个巨大的交易,以换取恒定的时间推送和弹出前端。

2 个答案:

答案 0 :(得分:12)

  

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

不,那是故事的结尾就在那里。 vector的重点是它一个纯粹连续的数据块"。这是实施的基本要求。

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

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

因此,界面无法提供阻止vector连续的其他要求。

答案 1 :(得分:9)

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

该标准为完全您需要的方案提供deque:快速推送/弹出容器的前/后。