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
需要额外的间接寻址来访问elments李>std::deque
中的迭代器必须是智能指针,而不是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::deque
vector
可以轻松地放入CPU缓存和ar