vector
和deque
都提供了在末尾插入元素的函数push_back
。
deque
还提供了一个在开头插入元素的函数push_front
,但对于vector
而言,这有点昂贵。
我的问题是,既然我们可以使用deque
实现与vector
相同的功能(push_back
),那么为什么还需要vector
呢?
向量和双端队列的一个主要区别是后者允许高效地在结构体的前端和后端插入。
双端队列也不能保证它们的元素在内存中是连续的,因此 at-style 操作符(索引操作)可能不太高效。
请注意,在实践中,这种差异对于较小的集合来说并不重要,但如果,例如,集合大小增加或者你每秒钟进行多次修改,则通常会变得更加重要。
std::deque
至少在常规使用中具有std::vector
的所有功能,但是对它进行索引和迭代通常会稍微慢一些;如果您使用了reserve
,在末尾添加也可能会出现相同的情况。当然,std::vector
是默认容器,使用其他容器将向读者暗示您具有特殊要求。std::vector
还保证连续性,因此它(仅它)可以用于与需要T*
或T const*
的旧函数进行接口。std::vector
比std::deque
更快,尽管我经常从前面删除元素(使用容器作为队列,在后面推入,在前面弹出)。我不知道是否普遍适用;在我的情况下,队列相对较短(从不超过约15个元素,通常更少),内容是char
,非常便宜的复制。但总的来说,即使需要从前面删除元素,我也会使用std::vector
,仅因为它更好的局部性。如果我预计有成千上万个昂贵的元素需要复制,我可能只会考虑std::deque
。std::deque
是双端队列。与std::vector
不同,它不仅提供在末尾插入和删除元素的高效方法,还能在开头进行操作。向量保证将元素存储在连续的存储器中,因此您可以通过索引/偏移量访问其元素。std::deque
没有这个保证。
[]
或at()
访问deque
的元素。在该层面上,接口没有区别。 - James Kanze
std::deque
也是如此。 - Joseph Mansfieldstd::vector
中从前面插入可能比在std::deque
中更便宜。 - James Kanzechar
,使用C风格数组或std::vector
(或C++11中的std::array
)。对于执行深拷贝(包括分配等)的数百万个元素,请使用std::deque
。在两者之间是分界线,但我不知道在哪里。 - James Kanze