C++ 为什么更喜欢std::vector而不是std::deque?
它们都具有O(1)的访问复杂度和O(n)的随机插入/移除复杂度。但由于重新分配和复制,vector在扩展时的成本更高,而deque没有这个问题C++ 为什么更喜欢std::vector而不是std::deque?,c++,stl,C++,Stl,它们都具有O(1)的访问复杂度和O(n)的随机插入/移除复杂度。但由于重新分配和复制,vector在扩展时的成本更高,而deque没有这个问题 >似乎有更好的性能,但为什么大多数人使用向量代替DEQE?< P>从C++标准部分23.1.1: vector is the type of sequence that should be used by default... deque is the data structure of choice when most insertions and
>似乎有更好的性能,但为什么大多数人使用向量代替DEQE?
< P>从C++标准部分23.1.1:vector is the type of sequence that should be used by default... deque is
the data structure of choice when most insertions and deletions take place
at the beginning or at the end of the sequence.
然而,报告中有一些论点
理论上,vector
至少与deque
一样有效,因为它提供了其功能的一个子集。如果您的任务只需要vector接口提供的功能,请选择vector-它不能比deque更差。对于cplusplus:
因此,它们提供了与向量类似的功能,但具有
在项目开始时有效地插入和删除元素
序列,而不仅仅是在它的结尾。但是,与向量不同,deques是
不保证将其所有元素存储在连续存储器中
位置,因此不允许通过将指针偏移到
元素
就我个人而言,我更喜欢使用
deque
(出于某种原因,我总是会破坏自己,不得不使用push\u front
),但vector
确实有其用途/区别,主要有:
vector
具有连续内存,而deque
通过页/块进行分配。
请注意,页面/块非常有用:在容器的前面固定时间插入/擦除。一个大内存块分解成一系列小内存块比一个内存块的效率更高,这也是一个典型的情况
您还可以争辩说,因为deque
是“缺少”大小保留方法(capacity
/reserve
),所以您不必太担心
我强烈建议你阅读萨特关于这个话题的文章
但由于重新分配和复制,vector在扩展时成本更高
虽然vector
有时确实需要在数组增长时重新分配数组,但它会呈指数增长,因此摊销的复杂性仍然是O(1)。通常,您可以通过明智地使用reserve()
来避免重新分配
看来德克的表现更好
表现有很多方面;push_back
所用的时间只有一分钟。在某些应用程序中,容器可能很少修改,或者在启动时填充,然后再也不会修改。在这种情况下,迭代和访问速度可能更为重要
vector
是最简单的容器:一个连续数组。这意味着迭代和随机访问可以通过简单的指针算法实现,访问元素的速度可以和取消引用指针的速度一样快
deque
有进一步的要求:它不能移动元素。这意味着一个典型的实现需要额外级别的间接寻址——它通常被实现为类似于指向数组的指针数组。这意味着元素访问需要解引用两个指针,这将比一个指针慢
当然,速度通常不是一个关键问题,您根据容器的行为属性而不是性能来选择容器。如果您需要元素是连续的,您可以选择vector
,也许可以使用基于指针和数组的API。如果希望保证元素不会移动,可以选择deque
或list
,以便存储指向元素的指针
why most people use vector instead of deque?
因为这就是他们所学到的
vector
和deque
的用途稍有不同。如果您只需要这些,那么它们都可以用作对象的简单容器。在学习C++程序时,这是大多数人需要的——一个桶,把东西丢进,从中拿出来,然后走。
当StackOverflow被问到“默认情况下应该使用哪个容器”这样的问题时,答案几乎总是vector
。这个问题通常从C++中的学习到编程的背景下提出,在程序员问这样一个问题的时候,他们还不知道他们不知道什么。还有很多他们还不知道。因此,我们(StackOverflow)需要一个容器,它可以满足几乎所有的需求,无论好坏,可以在几乎任何上下文中使用,并且不需要程序员在找到近似正确答案之前问了所有正确的问题。此外,本标准特别建议使用向量
<代码>向量不是所有用途的最佳选择,实际上,代码> DEQu< /COD>比常用的代码>矢量< /代码>要好很多,但对于学习程序员来说,我们应该从标准建议到新手C++程序员的不同,所以StAcExcel在vector
和deque
之间进行选择时,一些他们以前不想问的问题是: