Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';向量是否使用偏移量?_C++_Vector - Fatal编程技术网

C++ 为什么';向量是否使用偏移量?

C++ 为什么';向量是否使用偏移量?,c++,vector,C++,Vector,这个问题真的很简单。在向矢量前面添加或删除时,为什么需要移动所有元素以适应此更改?使用偏移量来修改索引到向量时给定的索引可以解决此问题。虽然这可能会导致(最多)内存中出现2个连续的数据块,但这似乎是将线性操作减少到恒定时间的一个小代价 下面是一个尽可能清楚的例子: ['A', 'B', 'C', _, _, _, _, _] offset is 0, 4th through 8th position unused. push_front('M') ['A', 'B', 'C, _, _, _,

这个问题真的很简单。在向矢量前面添加或删除时,为什么需要移动所有元素以适应此更改?使用偏移量来修改索引到向量时给定的索引可以解决此问题。虽然这可能会导致(最多)内存中出现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
:快速推送/弹出容器的前部/后部。

这就是它的用途。vector不用于删除中间的元素。您可以这样做,但有更好的容器(例如链表)。向量保证元素存储在连续的内存中,原因是每次使用“代码> STD::vector::运算符[]/Cord>你必须将该偏移量添加到索引中。C++矢量索引甚至没有被检查,除非你在中明确要求用<代码>。为什么他们要让每个人为每个向量索引上的这些额外操作付费?您所描述的是一个非常有用的容器,而标准库却缺少它。但是,它需要使用不同的名称,因为它破坏了
std::vector
提供的保证。