由于vector
和deque
两者都为push_back
元素提供了函数。
其中deque
还提供了一个函数push_front
来在开头插入元素,这在vector
的情况下成本很高。
我的问题是,当我们使用push_back
实现vector
的相同功能(deque
)时,为什么需要vector
?
答案 0 :(得分:10)
矢量和deques之间的一个主要区别是后者允许在结构的前面以及背面有效插入。
Deques也不保证它们的元素在内存中是连续的,因此at-style操作符(索引)可能效率不高。
请注意,对于较小的集合,这种差异在实践中不太重要,但如果例如集合大小增加或者您每秒许多次修改它,通常会变得更加重要。< / p>
答案 1 :(得分:6)
表现,主要是。一个std::deque
拥有全部
std::vector
的功能,至少在正常使用情况下,但是
索引和迭代它通常会有所不同
慢点;如果你这样做,最后可能会追加
使用reserve
。当然,std::vector
是默认值
容器,使用其他任何东西都会向读者建议
你有特殊要求。
std::vector
也保证了连续性,所以它(只有它)
可用于连接需要T*
的遗留函数
或T const*
。
我可能会补充说,有一次我实际上有表演
问题和衡量标准std::vector
比std::deque
快,
尽管我经常从中删除元素
前面(使用容器作为队列,推动后面,
并弹出前面)。我不知道这是否概括,
然而;在我的情况下,队列相对较短(从来没有更多
大约15个元素,通常少了很多),以及内容
是char
,这是非常便宜的复制。但总的来说,
即使我需要删除元素,我也会使用std::vector
前面,如果只是因为它更好的地方。我可能
如果我期望成千上万的元素,只考虑std::deque
复制费用很高。
答案 2 :(得分:1)
std::deque
是一个双端队列。它提供了有效插入和删除元素的开头,而不仅仅是最后,如std::vector
所做的那样。保证向量将元素存储在连续存储中,因此您可以通过索引/偏移量访问其元素。 std::deque
不提供此保证。