C++ 为什么std::vector比std::deque更受欢迎?

C++ 为什么std::vector比std::deque更受欢迎?,c++,vector,deque,C++,Vector,Deque,可能重复: 我很好奇,为什么它比其他的东西更受欢迎。Deque在查找方面几乎同样高效,在插入方面更高效(没有vector::reserve),并且允许在前面插入/删除 赫伯·萨特曾经建议(我正在解释)。然而,在最近的一次谈话中,他再次强烈建议将std::vector作为默认容器。根据我之前的链接,即使是标准也有类似的措辞 这种差异有什么原因吗?仅仅是因为vector更简单、更广为人知,还是因为技术原因?还是说向量只是一个更酷的名字 std::vector非常容易理解、简单,并且与C兼容(无论是

可能重复:

我很好奇,为什么它比其他的东西更受欢迎。Deque在查找方面几乎同样高效,在插入方面更高效(没有vector::reserve),并且允许在前面插入/删除

赫伯·萨特曾经建议(我正在解释)。然而,在最近的一次谈话中,他再次强烈建议将
std::vector
作为默认容器。根据我之前的链接,即使是标准也有类似的措辞


这种差异有什么原因吗?仅仅是因为
vector
更简单、更广为人知,还是因为技术原因?还是说向量只是一个更酷的名字

std::vector
非常容易理解、简单,并且与C兼容(无论是在内存布局方面,还是在使用指针作为迭代器方面)

对于某些操作,它也比std::deque更有效。通过索引访问元素就是一个例子


对于给定的任务,使用最简单的容器来完成任务是有意义的。在许多情况下,最简单的容器是
std::vector

除了
std::vector
是最常见的容器类之外,它还比
std::deque
有几个优点,即:

  • std::vector
    不同,典型的
    std::deque
    需要额外的间接寻址来访问elments
  • std::deque
    中的迭代器必须是智能指针,而不是
    std::vector
    中的指针
  • std::vector的元素保证是连续的,因此它与以数组为参数的c风格函数兼容
  • std::deque
    不提供控制容量和重新分配时间的支持

特别是,最后一点值得注意。

人们使用std::vector代替std::deque的原因很简单。它们与许多C库接口,并且具有需要指向连续存储的指针的参数,而std::deque不能保证这一点

另一个原因是,当您根据std::deque构建代码,并且您的需求发生变化,因此您必须支持连续访问时,您将需要进行一些重构


我不得不提到,有些人的作者声称他们创造了更高效的向量实现,以便在向量增加时克服效率低下的问题。

我不能为其他人说话,但我可以为自己说话

当我第一次读到
std::deque
时,我认为它足够酷了,以至于有一段时间,我不仅把它当作默认的容器,而且几乎把它当作我使用的唯一容器

然后有人问为什么,我详细阐述了它的优点,为什么它是用于几乎所有东西的最佳容器,以及它是如何比std::vector更通用的

幸运的是,对我的决定提出质疑的人足够有说服力,我做了一些测试。测试表明,几乎在所有情况下,
std::deque
都比
std::vector
慢,通常慢一个重要因素(例如,大约2)。事实上,在我使用
std::deque
编写的代码中,仅用
std::vector
替换
std::deque
就可以在除少数情况外的所有情况下提高速度

从那以后,我在一些情况下使用了
std::deque
,但肯定不再将其视为默认值。一个简单的事实是,在通常的实现中,在大多数情况下,它明显慢于
std::vector


然而,我应该补充一点,我可以合理地确定,如果实现正确,它几乎可以在所有情况下都与std::vector等价。从渐进的角度来看,大多数人使用的表示法无疑是很好的,但在现实世界中效果并不太好(出于许多目的)。

std::deque的结构有点复杂,这使得朴素的迭代比
std::vector
的成本更高。插入到
std::vector
及其重新分配中往往不是什么大问题,尤其是在使用
reserve()
且仅在末尾追加时。另外,
std::vector
的无效规则更容易理解,尽管
std::deque
的一个优点是,当只在任意一端插入/删除对象时,对象保持不变(请注意,
std::deque
迭代器在每次插入时都会失效,与插入发生的位置无关)。std:vector的另一个优点是保证值在内存中是连续的,从而减少内存分配


我想,我建议使用 STD::DEQu</Cord>算法被不断优化以使用分段序列(我不知道任何标准C++库都做了优化),用户总是使用算法来访问序列。(据我所知,只有一小部分用户考虑使用算法)。否则,我会怀疑

std::deque
是性能方面更好的选择,只要您利用其特定属性(例如,对象保持不变,并且可以在末尾插入/删除)。不过,这两种选择值得分析。

这只是我的观点,但一般来说,我认为我们使用前端不如使用后端。IIRC Scott Meyers和Bjarne都推荐vector作为“默认容器”。此外,据我所知,它是唯一一个标准容器,其底层内存模型与C API兼容(所以我想这比deque还要好?@JanDvorak:不,.@JanDvorak:不知道,我不太关心Java;)而且
vector
可以轻松地放入CPU缓存和ar