我很困惑。我正在阅读有关使用数组的向量的实现。虽然我们在简单的动态数组实现上一切都很好。
有人提到你可以通过使用循环方式的数组来实现向量,并且这将使元素的添加和删除(对于第一个和最后一个)在恒定时间内运行。这不是链表应该做的吗?
我想知道它是如何工作的,但我真的找不到实现或正确的解释。关于什么是一般想法以及如何实施它的任何信息都受到欢迎。
编辑:我的猜测是新数据应写在“最旧的”数据上,并且数组的大小是固定的,并且您必须有一个存储最后使用位置的变量。
答案 0 :(得分:0)
您在谈论circular buffer
不幸的是,您无法使用它来实现矢量,因为您无法在中间插入或从中间删除等。
答案 1 :(得分:0)
由于C ++ 03 vector
保证了连续存储,也就是说每个0 <= n < vec.size()
:
&vec[n] == &vec[0] + n
这意味着无法使用循环缓冲区来实现vector
。在你从缓冲区的末尾“开始”“开始”时,你违反了这个限制。
如果您认为operator[]
可以返回满足此要求的重载operator&
的某个代理 - 否,则不能,则需要返回T&
。
除了这个要求之外,我认为标准中没有任何内容可以阻止使用循环缓冲区来实现vector
。在缓冲区已满的情况下,您将执行与vector
实际相同的操作 - 重新分配到更大的缓冲区。行为的唯一区别是当您在开始时擦除或插入时会发生什么。使用循环缓冲区,所有其他元素将保持静止,假设有足够的空间,而通常它们都会移动。但是标准没有明确要求它们移动,并且由于迭代器和对所有元素的引用在开始时插入或擦除时无效,程序无法合理地依赖它们以任何特定方式移动
std::list
确实可以在开始和结束时以恒定时间插入和删除。 std::deque
可以。