矢量vs Deque在中间插入

时间:2012-09-14 14:37:35

标签: c++ stl vector deque

我知道当插入位于前端或末端时, deque vector 更有效,如果我们必须进行指针算法,则矢量更好。但是当我们必须在中间执行插入时要使用哪一个。和为什么。?

4 个答案:

答案 0 :(得分:11)

您可能认为deque具有优势,因为它将分解的数据存储到块中。但是,要在恒定时间内实现operator[],需要所有这些块都具有相同的大小。在中间插入或删除元素仍然需要在一侧或另一侧移动所有值,与vector相同。由于vector更简单,并且具有更好的缓存局部性,因此应该提前实现。

答案 1 :(得分:3)

使用标准库容器的选择标准是,您可以根据以下内容选择容器:

  1. 您要存储的数据类型&
  2. 您要对数据执行的操作类型。
  3. 如果您想在中间执行大量插入操作,最好使用std::list

    如果选择仅在std::dequestd::vector之间,则需要考虑以下因素:

    • 通常,在deque的情况下还有一个间接访问元素,所以元素 deques的访问和迭代器移动通常会慢一些。
    • 在对内存块具有大小限制的系统中,deque可能包含更多元素,因为它使用多个内存块。因此,对于deques,max_size()可能会更大。
    • Deques不支持控制容量和重新分配的时刻。在 特别是,除了在开头或结尾之外的任何元素的插入或删除 使引用deque元素的所有指针,引用和迭代器无效。 但是,重新分配可能比矢量更好,因为根据他们的 典型的内部结构,deques不必在重新分配时复制所有元素。
    • 内存块可能会在不再使用时被释放,因此内存大小为a deque可能会缩小(这不是标准强加的条件,但大多数实现都会这样做)

答案 2 :(得分:1)

std::deque 可以对大容器执行得更好,因为它通常实现为连续数据块的链接序列,而不是std::vector中使用的单个块。因此,在中间插入会导致较少的数据从一个地方复制到另一个地方,并且可能会减少重新分配。

当然,这是否重要取决于容器的大小和复制存储元素的成本。使用C ++ 11移动语义,后者的成本不那么重要。但最终,唯一可以通过实际应用进行分析的方法。

答案 3 :(得分:0)

Deque仍然会更有效率,因为每次插入元素时都不必移动一半的数组。

当然,只有在考虑大量元素时,这才真正重要,甚至建议运行基准测试并查看哪一个在特定情况下效果更好。请记住premature optimization is the root of all evil