为什么喜欢std :: vector而不是std :: deque?

时间:2013-09-26 14:48:57

标签: c++ stl

它们都具有O(1)的访问复杂度和O(n)的随机插入/删除复杂性。但是,由于重新分配和复制,矢量在扩展时的成本更高,而deque没有这个问题。

似乎deque有更好的表现,但为什么大多数人使用vector而不是deque?

5 个答案:

答案 0 :(得分:8)

从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.

opposite direction中有一些论点。

理论上vector至少与deque一样有效,因为它提供了其功能的子集。如果你的任务只需要vector的界面提供,那就选择vector - 它不能比deque更糟糕。

答案 1 :(得分:7)

why most people use vector instead of deque?

因为这是他们所教导的。

vectordeque的目的略有不同。它们都可以用作对象的简单容器,如果这就是你所需要的。当学习编程C ++时, 是大多数人所需要的 - 一个可以放入内容,从中获取内容并走过去的桶。

当StackOverflow被问到类似“我应该默认使用哪个容器”这样的问题时,答案几乎总是vector。这个问题通常是从学习C ++编程的背景中提出的,而且在程序员提出这样一个问题的时候,他们还不知道他们不知道什么。还有很多他们还不知道。因此,我们(StackOverflow)需要一个几乎适合所有需求的容器,可以在几乎任何环境中使用,并且不需要程序员在登陆接近正确答案的内容之前询问所有正确的问题。此外,标准特别建议使用vector。对于所有用途,vector不是最佳,事实上deque对于许多常见用途来说比vector更好 - 但对于一个用途来说,它并没有那么好学习程序员,我们应该从标准的建议到新手C ++程序员,因此StackOverflow登陆vector

在学习了语法的基础知识之后,我们可以说,在C ++编程背后的策略,程序员分成两个分支:那些关心学习更多,编写更好程序的人,以及那些没有。那些不这样做的人会永远坚持vector。我想很多程序员都会参加这个阵营。

试图超越这个阶段的稀有程序员开始提出其他问题 - 像你在这里问过的问题。他们知道有很多他们还不知道,他们想要开始发现这些东西是什么。他们会很快(或不那么快)发现,在vectordeque之间进行选择时,他们之前没有想到过的一些问题是:

  1. 我需要记忆力吗?
  2. 我是否需要避免大量重新分配?
  3. 插入后是否需要保留有效的迭代器?
  4. 我是否需要将我的收藏与某些古老的C-like功能兼容?
  5. 然后他们真的开始考虑他们正在编写的代码,发现更多他们不知道的东西,并且节拍继续......

答案 2 :(得分:6)

  

但是,由于重新分配和复制,矢量在扩展时的成本更高

虽然vector有时必须在数组增长时重新分配数组,但它会呈指数级增长,因此摊销的复杂性仍为O(1)。通常,您可以通过明智地使用reserve()来避免重新分配。

  

似乎deque有更好的表现

表现有很多方面; push_back所花费的时间只有一个。在某些应用程序中,容器可能很少被修改,或者在启动时填充,然后从不修改。在这种情况下,迭代和访问速度可能更重要。

vector是最简单的容器:一个连续的数组。这意味着可以通过简单的指针算法实现迭代和随机访问,并且访问元素可以与解除引用指针一样快。

deque还有其他要求:它不得移动元素。这意味着典型的实现需要额外的间接级别 - 它通常被实现为类似于数组指针的数组。这意味着元素访问需要解除引用两个指针,这两个指针将慢于一个。

当然,速度通常不是关键问题,您根据行为属性而不是性能来选择容器。如果需要连续的元素,可以选择vector,也许可以使用基于指针和数组的API。如果您希望保证元素不会移动,您可以选择dequelist,这样您就可以存储指针。

答案 3 :(得分:2)

对于cplusplus:

  

因此,它们提供了与矢量类似的功能,但具有   有效插入和删除元素也在开头   顺序,而不仅仅是在它的结尾。但是,与矢量不同,deques是   不保证将其所有元素存储在连续的存储中   位置,因此不允许通过偏移指针直接访问   元件。

答案 4 :(得分:0)

就个人而言,我更喜欢使用deque(我总是因为某种原因而不得不使用push_front,但vector确实有其用途/差异,主要是:

vector具有连续的内存,而deque通过页面/块分配。 注意,页面/块非常有用:容器前面的常量插入/擦除。通常情况下,分解为一系列较小块的大块内存比单个内存块更高效

你也可以说,因为deque是'缺失'尺码预订方法(capacity / reserve),所以你不用担心。

我强烈建议您阅读Sutters的GotW主题。