Vector vs Deque插入中间
Vector vs Deque insertion in middle
我知道,当插入位于前端或末端时,deque比vector更有效率,如果我们必须进行指针运算,vector会更好。但当我们必须在中间执行插入时,该使用哪一个呢。?为什么。?
您可能会认为deque
会有优势,因为它将数据存储成块。然而,在恒定时间内实现CCD_ 2需要所有这些块具有相同的大小。插入或删除中间的元素仍然需要将一侧或另一侧的所有值移位,与vector
相同。由于vector
更简单,并且具有更好的缓存局部性,因此它应该会脱颖而出。
标准库容器的选择标准是,您根据以下条件选择容器:
- 要存储的数据类型&
- 要对数据执行的操作类型
如果您想在中间执行大量插入,那么最好使用std::list
。
如果只是在std::deque
和std::vector
之间进行选择,那么有许多因素需要考虑:
- 通常,在deque的情况下还有一个间接访问元素,因此元素deques的访问和迭代器移动通常会慢一点
- 在内存块大小有限制的系统中,deque可能包含更多的元素,因为它使用多个内存块。因此,对于deques,
max_size()
可能更大 - Deques没有提供任何支持来控制容量和重新分配的时刻。在里面尤其是在开头或结尾以外的任何元素的插入或删除使引用deque元素的所有指针、引用和迭代器无效。然而,重新分配可能比矢量执行得更好,因为根据典型的内部结构,deques不必在重新分配时复制所有元素
- 内存块在不再使用时可能会被释放,因此deque可能会收缩(这不是标准强加的条件,但大多数实现都是这样)
std::deque对于大型容器可以执行得更好,因为它通常被实现为连续数据块的链接序列,而不是std::vector
中使用的单个块。因此,在中间插入会减少从一个地方复制到另一个地方的数据,并可能减少重新分配。
当然,这是否重要取决于容器的大小和复制存储的元素的成本。对于C++11移动语义,后者的代价就不那么重要了。但最终,了解的唯一方法是使用现实的应用程序进行评测。
Deque仍然更高效,因为它不必每次插入元素都移动一半的数组。
当然,只有在考虑了大量元素的情况下,这才是真正重要的,甚至运行一个基准测试,看看哪一个在您的特定情况下更好。请记住,过早优化是万恶之源。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 2D数组来自文本输入,中间有空格
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- 如何在文本文件中间插入字符
- 如何组合一个宽字符字符串,中间插入一些空字符
- 使用 std::move 在开始时插入矢量的中间元素不起作用
- 将元素插入到中间的矢量中
- C++ 在链表中间插入新节点时出现问题
- Vector vs Deque插入中间
- NCurses:在堆叠顺序的中间插入面板
- 在双向链表的中间插入一个节点
- 如何有效地将一系列项目插入中间的 std::d eque 中,带有 C++03
- C++ std::在中间和结尾之间插入的列表
- 有没有一种方法可以在向量常数时间的中间插入一些东西
- 如何在序列化期间插入字符串流的中间
- TinyXML2 -在XML中间插入元素