Vector vs Deque插入中间



我知道,当插入位于前端或末端时,dequevector更有效率,如果我们必须进行指针运算,vector会更好。但当我们必须在中间执行插入时,该使用哪一个呢。?为什么。?

您可能会认为deque会有优势,因为它将数据存储成块。然而,在恒定时间内实现CCD_ 2需要所有这些块具有相同的大小。插入或删除中间的元素仍然需要将一侧或另一侧的所有值移位,与vector相同。由于vector更简单,并且具有更好的缓存局部性,因此它应该会脱颖而出。

标准库容器的选择标准是,您根据以下条件选择容器:

  1. 要存储的数据类型&
  2. 要对数据执行的操作类型

如果您想在中间执行大量插入,那么最好使用std::list

如果只是在std::dequestd::vector之间进行选择,那么有许多因素需要考虑:

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

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

当然,这是否重要取决于容器的大小和复制存储的元素的成本。对于C++11移动语义,后者的代价就不那么重要了。但最终,了解的唯一方法是使用现实的应用程序进行评测。

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

当然,只有在考虑了大量元素的情况下,这才是真正重要的,甚至运行一个基准测试,看看哪一个在您的特定情况下更好。请记住,过早优化是万恶之源。

最新更新