可能重复:
为什么我更喜欢使用vector来deque
我很好奇为什么它std::vector比这更受欢迎std::deque.Deque几乎和查找一样有效,插入更有效(没有vector :: reserve),允许在前面插入/删除.
Herb Sutter曾经建议如果你想使用矢量,那就更喜欢deque(我在解读).然而,在最近关于编写Modern C++的演讲中,他再次强烈建议将其std::vector视为默认容器.根据我之前链接的GOTW,即使标准也有类似的措辞.
有这种差异的原因吗?它vector是否更简单,更为人所知,还是有技术原因?或者它vector只是一个更酷的名字..?
它们都具有O(1)的访问复杂度和O(n)的随机插入/删除复杂性.但是,由于重新分配和复制,向量在扩展时会花费更多,而deque没有这个问题.
似乎deque有更好的性能,但为什么大多数人使用vector而不是deque?
As vector和dequeBoth都为push_back最后的元素提供了一个函数.
其中deque还提供了一个push_front在开头插入元素的功能,在这种情况下有点成本vector.
我的问题是,当我们通过使用实现相同的功能(push_back)时,为什么需要? vectordequevector
几乎所有的编程语言都有一些使用动态数组的列表的实现,当它达到一定容量时会自动扩展。例如,Java 有ArrayList,C++ 有std::vector。
最近我了解了循环数组双端队列,它也是使用动态数组实现的。它们跟踪列表的起始索引,并使用模运算来访问元素。与数组列表一样,它们允许 O(1) 查找和 O(1) 在末尾插入,并且空间与 O(N) 成正比。但是,它们也允许在开头插入 O(1)。
(虽然 JavaArrayDeque实现了这种数据结构,但它不允许查找元素。C++std::deque似乎使用了不同的实现。)
如果这些数组双端队列具有与数组列表相同或更好的性能特征,那么为什么不总是将它们用作列表的默认实现呢?