Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么更喜欢std::vector而不是std::deque?_C++_Stl - Fatal编程技术网

C++ 为什么更喜欢std::vector而不是std::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

它们都具有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 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在矢量 >上。 在学习了语法的基础知识之后,我们将说,C++编程背后的策略,程序员分成两个分支:那些关心更多的学习和编写更好的程序的人,而那些不愿意学习的人。不这样做的人将永远坚持向量。我认为很多程序员都属于这个阵营

很少有程序员尝试超越这个阶段,他们开始问其他问题——就像您在这里问的问题一样。他们知道还有很多他们还不知道的东西,他们想开始发现这些东西是什么。他们会很快(或不太快)发现,当在
vector
deque
之间进行选择时,一些他们以前不想问的问题是:

  • 我需要连续的记忆吗
  • 我需要避免大量的重新分配吗
  • 插入后是否需要保留有效的迭代器
  • 我需要我的收藏与一些古老的类C函数兼容吗
  • 然后他们真正开始思考他们正在编写的代码,发现更多