【问题标题】:Which is faster: STL queue or STL stack?哪个更快:STL 队列或 STL 堆栈?
【发布时间】:2013-03-21 23:03:02
【问题描述】:

我正在实现拓扑排序的变体,它需要一个结构来保存没有传入边的元素。 queuestack 似乎都可以用于此目的,因为取出它们的顺序无关紧要。问题是:它们中的任何一个明显比另一个快吗?

【问题讨论】:

  • 回答:很可能不是。最佳答案:尝试两者并测试它。最佳答案:只使用一个,甚至不关心它。

标签: c++ performance stl stack queue


【解决方案1】:

虽然queuestack 在性能上并没有太大差异,但它们显然会导致不同的节点访问顺序。其中一个可能提供比另一个更适合缓存的顺序,具体取决于您的节点在内存中的布局方式。

【讨论】:

    【解决方案2】:

    回答您的主要问题:我不知道。我认为它们中的任何一个都没有明显更快,因为对于std::deque(堆栈和队列的默认内部容器),push_back 和 push_front(以及 pop_back 和 pop_front)是对称的。没有一个应该更快。但是,我建议将普通的旧 std::vector 与 push_backpop_back 一起使用,或者等效地使用

    std::stack<T, std::vector<T>>
    

    栈默认使用双端队列的原因见here

    【讨论】:

      【解决方案3】:

      queuestack 都是容器适配器,它们本身并不是完整的容器。 默认情况下,stackqueue 都是在 std::deque 之上实现的,如果您不更改此设置,它们应该具有相似的性能。

      这实际上取决于您正在编写什么样的应用程序,您可以选择最有利于那些您想要的操作的底层容器。

      【讨论】:

        【解决方案4】:

        它们都具有恒定的复杂性......您只需要计时以确定是否有任何常数更高

        http://www.cplusplus.com/reference/stack/stack/pop/
        http://www.cplusplus.com/reference/queue/queue/pop/
        

        【讨论】:

          【解决方案5】:

          队列和堆栈是不同的。 首先是FIFO,栈是FILO

          【讨论】:

          • 恐怕这不能回答OP的问题。
          • 我同意王宋的观点。我只需要一个临时对象存储。
          • 所以使用纯向量。在这里使用堆栈或队列会令人困惑。
          • @aguyngueran Vector 由于复制而产生巨大的开销。它在客户端应用程序中(通常)并不显着,但它可能对服务器端和其他特定应用程序产生巨大的性能影响。 vector 不是一个全能的容器。如果你想存储一个临时列表 - 向量很棒。如果您想存储临时的单个对象 - 它会影响性能。
          猜你喜欢
          • 2021-12-20
          • 2014-01-09
          • 1970-01-01
          • 2021-10-06
          • 1970-01-01
          • 1970-01-01
          • 2020-08-11
          • 2021-03-17
          • 2020-09-16
          相关资源
          最近更新 更多