【发布时间】:2014-08-29 15:30:30
【问题描述】:
我正在阅读有关 deques 与 vectors 的文章,并遇到了它的 wikipedia entry,它说使用动态数组的 deque 的三种可能实现之一是:
从底层数组的中心分配双端队列内容,以及 到达任一端时调整底层数组的大小。这 方法可能需要更频繁地调整大小并浪费更多空间, 特别是当元素只插入一端时。
我想知道是否有任何 STL(或 STL 风格)实现实际使用这种中心分配策略?
我之所以这么问是因为这个策略看起来相当吸引人,因为它只涉及一个底层数组,因此消除了内存不连续问题,这可能是deque 与vector 相比的唯一主要问题。如果我理解正确,这很可能是 std::vector 的替代品,它允许 O(1) pop_front(摊销)或 deque 的替代品,具有内存连续性保证。我假设这是以将std::vector 的缓冲空间增加一倍为代价的,这对我的用例来说不是一个主要问题。
另外,在这样的容器中间插入/删除是否会平均花费 std::vector 一半的时间?
更新:
正如@Lightness Races in Orbit 指出的那样,在当前标准下不会使用这样的实现,因为没有人可以从与 STL 的每份合同中受益,而每个人都会受到不利影响。关于缺点,我还有一个问题是:
是否可以实现一个新的 vector 或 deque 类似容器(比如bivector),这样除了std::vector 的功能/操作符之外,
1) 提供(摊销的)恒定时间push_front() 和pop_front() 操作和
2) 在增加大小后保证内存连续性但不保证迭代器有效性?
我想在幕后使用一个数组,deque 上的许多间接/性能问题都会消失。
【问题讨论】:
-
在到达数组末端后,您是否还需要移动内容以保持连续性?
-
也许我们可以像
std::vector那样在到达右端时重新分配内存。我认为重新分配的成本在使用非破坏插入平均时与vector一样摊销为 O(1)。我想我们可以“在两端”使用vector技巧。
标签: c++ c++11 vector stl deque