C++ 为什么';向量是否使用偏移量?
这个问题真的很简单。在向矢量前面添加或删除时,为什么需要移动所有元素以适应此更改?使用偏移量来修改索引到向量时给定的索引可以解决此问题。虽然这可能会导致(最多)内存中出现2个连续的数据块,但这似乎是将线性操作减少到恒定时间的一个小代价 下面是一个尽可能清楚的例子:C++ 为什么';向量是否使用偏移量?,c++,vector,C++,Vector,这个问题真的很简单。在向矢量前面添加或删除时,为什么需要移动所有元素以适应此更改?使用偏移量来修改索引到向量时给定的索引可以解决此问题。虽然这可能会导致(最多)内存中出现2个连续的数据块,但这似乎是将线性操作减少到恒定时间的一个小代价 下面是一个尽可能清楚的例子: ['A', 'B', 'C', _, _, _, _, _] offset is 0, 4th through 8th position unused. push_front('M') ['A', 'B', 'C, _, _, _,
['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
:快速推送/弹出容器的前部/后部。这就是它的用途。vector不用于删除中间的元素。您可以这样做,但有更好的容器(例如链表)。向量保证元素存储在连续的内存中,原因是每次使用“代码> STD::vector::运算符[]/Cord>你必须将该偏移量添加到索引中。C++矢量索引甚至没有被检查,除非你在中明确要求用<代码>。为什么他们要让每个人为每个向量索引上的这些额外操作付费?您所描述的是一个非常有用的容器,而标准库却缺少它。但是,它需要使用不同的名称,因为它破坏了std::vector
提供的保证。