我知道当插入位于前端或末端时, deque 比 vector 更有效,如果我们必须进行指针算法,则矢量更好。但是当我们必须在中间执行插入时要使用哪一个。和为什么。?
答案 0 :(得分:11)
您可能认为deque
具有优势,因为它将分解的数据存储到块中。但是,要在恒定时间内实现operator[]
,需要所有这些块都具有相同的大小。在中间插入或删除元素仍然需要在一侧或另一侧移动所有值,与vector
相同。由于vector
更简单,并且具有更好的缓存局部性,因此应该提前实现。
答案 1 :(得分:3)
使用标准库容器的选择标准是,您可以根据以下内容选择容器:
如果您想在中间执行大量插入操作,最好使用std::list
。
如果选择仅在std::deque
和std::vector
之间,则需要考虑以下因素:
max_size()
可能会更大。答案 2 :(得分:1)
std::deque 可以对大容器执行得更好,因为它通常实现为连续数据块的链接序列,而不是std::vector
中使用的单个块。因此,在中间插入会导致较少的数据从一个地方复制到另一个地方,并且可能会减少重新分配。
当然,这是否重要取决于容器的大小和复制存储元素的成本。使用C ++ 11移动语义,后者的成本不那么重要。但最终,唯一可以通过实际应用进行分析的方法。
答案 3 :(得分:0)
Deque仍然会更有效率,因为每次插入元素时都不必移动一半的数组。
当然,只有在考虑大量元素时,这才真正重要,甚至建议运行基准测试并查看哪一个在特定情况下效果更好。请记住premature optimization is the root of all evil。