【问题标题】:The difference between vector and deque [duplicate]向量和双端队列的区别[重复]
【发布时间】:2014-03-30 20:42:47
【问题描述】:

因为vectordeque 都提供了一个函数到最后一个元素push_back

其中deque 还提供了一个函数push_front 在开头插入元素,这在vector 的情况下有点昂贵。

我的问题是什么时候我们可以通过使用deque 实现与vector 相同的功能(push_back),那么为什么需要vector

【问题讨论】:

    标签: c++ c++11 vector deque


    【解决方案1】:

    向量和双端队列之间的一个主要区别是后者允许在结构的前端以及后端高效插入。

    Deques 也不保证它们的元素在内存中是连续的,因此 at 样式的运算符(索引)可能效率不高。

    请注意,对于较小的集合,这种差异在实践中不太重要,但通常会变得更加重要,例如,如果集合大小增加或您每秒修改它多次次。

    【讨论】:

    • 有效插入取决于。如果元素不是太多,而且复制起来也不会太贵,在std::vector 中插入前面可能比在std::deque 中更便宜。
    • @James,如果您的结构只包含很少的元素,那么您最好使用数组而不用担心集合 :-) 我更多地考虑更大的集合,它更有可能双端队列对于前插入会更有效。但是你提出了一个很好的观点,所以我会补充它。
    • @paxdiablo 问题是:容器何时变得足够大以证明差异是合理的。很久以前,我有一位同事测量了转移一百万字节所需的时间,结果出奇的低(但当时高速缓存和潜在的未命中并没有发挥作用)。最后,我没有任何真正的答案:对于 10 char,使用 C 样式数组或 std::vector(或 C++11 中的 std::array)。对于数以百万计的进行深度复制(包括分配等)的元素,请使用std::deque。中间的某个地方是中断线,但我不知道在哪里。
    • 请注意,如果要保留指向元素的指针,则必须使用向量,因为双端队列将被移动,从而导致指针无效。
    【解决方案2】:

    主要是性能。 std::deque 拥有所有 std::vector 的功能,至少对于正常使用,但是 索引和迭代它通常会有点 慢点;如果你有 使用reserve。当然,std::vector 是默认值 容器,使用其他任何东西都会向读者建议 你有特殊要求。

    std::vector 也保证连续性,所以它(而且只有它) 可用于连接需要T* 的遗留功能 或T const*

    我可能会补充说,有一次我实际上有一次表演 问题和测量,std::vectorstd::deque 快, 尽管事实上我经常从 前面(使用容器作为队列,在后面推, 并在前面弹出)。不知道能不能概括 然而;就我而言,队列相对较短(从来没有更多 大约 15 个元素,通常更少),以及内容 是char,复制起来非常便宜。但总的来说, 即使我需要从中删除元素,我也会使用 std::vector 前线,如果只是因为它更好的位置。我可能会 如果我期望有数千个元素,则只考虑std::deque, 复制成本很高。

    【讨论】:

    • 我实现了一个包含 100 个元素的 FIFO 结构,用于缓冲一些输入传感器数据。我通过推回新的传入元素并在达到 100 的大小时弹出前端来实现双端队列。您认为这是一个可接受的架构选择吗?我想知道您对哪种方法更好地实现用于缓冲传感器数据的先进先出结构的看法。提前谢谢你
    【解决方案3】:

    std::deque 是一个双端队列。它在开头也提供了有效的元素插入和删除,而不仅仅是在结尾处,就像std::vector 所做的那样。向量保证将元素存储在连续存储中,因此您可以通过索引/偏移量访问其元素。 std::deque 不提供此保证。

    【讨论】:

    • 您还可以使用[]at() 访问deque 的元素。该级别的界面没有区别。
    猜你喜欢
    • 2012-03-27
    • 2015-05-01
    • 2020-06-23
    • 2015-08-11
    • 2018-05-18
    • 2015-04-04
    • 2015-03-31
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多