【发布时间】:2014-03-30 20:42:47
【问题描述】:
因为vector 和deque 都提供了一个函数到最后一个元素push_back。
其中deque 还提供了一个函数push_front 在开头插入元素,这在vector 的情况下有点昂贵。
我的问题是什么时候我们可以通过使用deque 实现与vector 相同的功能(push_back),那么为什么需要vector?
【问题讨论】:
因为vector 和deque 都提供了一个函数到最后一个元素push_back。
其中deque 还提供了一个函数push_front 在开头插入元素,这在vector 的情况下有点昂贵。
我的问题是什么时候我们可以通过使用deque 实现与vector 相同的功能(push_back),那么为什么需要vector?
【问题讨论】:
向量和双端队列之间的一个主要区别是后者允许在结构的前端以及后端高效插入。
Deques 也不保证它们的元素在内存中是连续的,因此 at 样式的运算符(索引)可能效率不高。
请注意,对于较小的集合,这种差异在实践中不太重要,但通常会变得更加重要,例如,如果集合大小增加或您每秒修改它多次次。
【讨论】:
std::vector 中插入前面可能比在std::deque 中更便宜。
char,使用 C 样式数组或 std::vector(或 C++11 中的 std::array)。对于数以百万计的进行深度复制(包括分配等)的元素,请使用std::deque。中间的某个地方是中断线,但我不知道在哪里。
主要是性能。 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 的元素。该级别的界面没有区别。