为什么std::vector比std::deque更受欢迎
Why is std::vector so much more popular than std::deque?
可能的重复:
为什么我更喜欢使用矢量来消除
我很好奇为什么std::vector
比std::deque
更受欢迎。Deque在查找方面几乎同样高效,在插入方面更高效(没有vector::reserve),并允许在前面插入/删除。
赫伯·萨特曾建议,若你们想使用矢量,那个就更喜欢deque(我是转述)。然而,在最近一次关于编写现代C++的演讲中,他再次强烈建议将std::vector
作为默认容器。根据我之前链接的GOTW,即使是标准也有类似的措辞。
造成这种差距的原因是什么?只是vector
更简单、更广为人知,还是有技术原因?还是vector
只是一个更酷的名字?
我不能为别人说话,但我可以为自己说话。
当我第一次读到std::deque
时,我觉得它很酷,有一段时间,我不仅把它当作默认容器,而且几乎把它当作我使用的仅的容器。
然后有人问为什么,我详细阐述了它的优点,为什么它是几乎所有东西的最佳容器,以及它是如何比std::vector
更通用的。
幸运的是,那个质疑我决定的人足够有说服力,我做了一些测试。测试表明,几乎在所有情况下,std::deque
都比std::vector
慢——通常是一个重要因素(例如,大约2)。事实上,在我使用std::deque
编写的代码中,仅用std::vector
替换std::deque
就可以在除少数情况外的所有情况下加速。
从那以后,我在一些情况下使用了std::deque
,但绝对不再将其视为默认值。简单的事实是,在通常的实现中,对于的大多数目的,它明显慢于std::vector
。
然而,我应该补充一点,我有理由确信,如果实现正确,它在几乎所有情况下都可以几乎等同于std::vector
。大多数人使用的表示从渐进的角度来看无疑是很好的,但在现实世界中(出于许多目的)效果并不那么好。
std::vector
非常容易理解、简单,并且与C兼容(无论是在内存布局方面,还是在使用指针作为迭代器方面)。
对于某些操作,它也比std::deque
更有效。通过索引访问元素就是一个例子。
对于给定的任务,使用最简单的容器来完成任务是有意义的。在许多情况下,最简单的容器是std::vector
。
人们使用std::vector而不是std::deque的原因很简单。它们与许多C库接口,并且它们有一些带有参数的函数,这些函数需要指向连续存储的指针,而std::deque不能保证这一点。
另一个原因是,当您根据std::deque构建代码,并且您的需求发生了变化,因此您必须支持连续访问时,您将需要进行一些重构
我不得不提到,有些库的作者声称已经创建了更高效的矢量实现,以便在容量增加时克服效率低下的问题。
std::deque
的结构有点复杂,这使得天真迭代比std::vector
要贵得多。插入到std::vector
及其重新定位往往不是什么大问题,尤其是当使用reserve()
并仅附加到末尾时。此外,std::vector
有更容易理解的无效规则,尽管实际上std::deque
的一个优点是,当只在两端插入/删除对象时,对象保持不变(注意,std::deque
迭代器在每次插入时都会失效,与插入发生的位置无关)。std:vector
的另一个优点是保证值在内存中是连续的,从而减少内存分配。
我想,我建议使用std::deque
算法,这些算法一直被优化为使用分段序列(我不知道有任何标准C++库可以进行这种优化),并且用户一直在使用算法访问序列(据我所知,只有一小部分用户考虑使用算法的选项)。否则,我会怀疑std::deque
在性能方面是更好的选择,只有当你利用它的特定属性时(例如,对象保持不变,并且你可以在最后插入/删除)。不过,值得对这两种选择进行分析。
除了std::vector
是最常见的容器类外,它还比std::deque
有几个优点,即:
- 与
std::vector
的情况不同,典型的std::deque
需要额外的间接访问来访问elment - 在
std::deque
的情况下,迭代程序必须是智能指针,而不是像在std::vector
的情况下那样的指针 std::vector
的元素保证是连续的,因此它与以数组为参数的c样式函数兼容std::deque
不提供控制容量和重新分配时刻的支持
特别是最后一点值得注意。
- 如何仅将新添加的元素复制到std :: Deque中
- 为什么STD :: Deque子阵列尺寸固定
- 为什么std::vector比std::deque更受欢迎
- STD Deque出奇地慢
- c++11移动std::deque或std::list的插入
- 将std::deque的现有元素推到前面
- C++std::从std::deque复制到std:;设置
- std::deque::erase函数的时间复杂度是多少
- 如何在Visual studio 2010中查看存储在std::deque中的内容(调试模式)
- 类的const成员出现std::deque::erase编译错误
- 对std::deque执行迭代器在容器两端插入或擦除后会失效
- 一个线程读一个线程写,std::deque是安全的
- std::deque::push_back/front的复杂度要求
- c++ std::deque实现:为什么不使用循环缓冲区
- 为什么std::deque的效率这么差?
- 为什么std::deque在默认构造函数中为它的元素分配内存?
- Bug with std::deque?
- 如何获取指向原始数据的std::deque指针
- 如何在分配新块时控制' std::deque '的块大小
- 如何避免在std::deque中' deque迭代器不可解引用' ?锁