真的很简单的问题。在向量的前面添加或删除时,为什么需要移动所有元素以适应此更改?使用偏移来修改索引到向量时给出的索引将解决此问题。当然,这可能会导致(最多)内存中的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并不是一个巨大的交易,以换取恒定的时间推送和弹出前端。
答案 0 :(得分:12)
我明白这意味着可能没有一个纯粹连续的数据块
不,那是故事的结尾就在那里。 vector
的重点是它是一个纯粹连续的数据块"。这是实施的基本要求。
执行此操作的能力是vector
完整目的的核心部分:
T *ptr = &vec[0];
ptr+1;
ptr == &vec[1];
因此,界面无法提供阻止vector
连续的其他要求。
答案 1 :(得分:9)
向量背后的整个想法是针对单个连续数据块:例如,您可以将它们(好的,第一个元素的地址)传递给C API,获得良好的缓存局部性等等。
该标准为完全您需要的方案提供deque
:快速推送/弹出容器的前/后。