【发布时间】:2013-03-21 23:03:02
【问题描述】:
我正在实现拓扑排序的变体,它需要一个结构来保存没有传入边的元素。 queue 和 stack 似乎都可以用于此目的,因为取出它们的顺序无关紧要。问题是:它们中的任何一个明显比另一个快吗?
【问题讨论】:
-
回答:很可能不是。最佳答案:尝试两者并测试它。最佳答案:只使用一个,甚至不关心它。
标签: c++ performance stl stack queue
我正在实现拓扑排序的变体,它需要一个结构来保存没有传入边的元素。 queue 和 stack 似乎都可以用于此目的,因为取出它们的顺序无关紧要。问题是:它们中的任何一个明显比另一个快吗?
【问题讨论】:
标签: c++ performance stl stack queue
虽然queue 和stack 在性能上并没有太大差异,但它们显然会导致不同的节点访问顺序。其中一个可能提供比另一个更适合缓存的顺序,具体取决于您的节点在内存中的布局方式。
【讨论】:
回答您的主要问题:我不知道。我认为它们中的任何一个都没有明显更快,因为对于std::deque(堆栈和队列的默认内部容器),push_back 和 push_front(以及 pop_back 和 pop_front)是对称的。没有一个应该更快。但是,我建议将普通的旧 std::vector 与 push_back 和 pop_back 一起使用,或者等效地使用
std::stack<T, std::vector<T>>
栈默认使用双端队列的原因见here。
【讨论】:
queue 和 stack 都是容器适配器,它们本身并不是完整的容器。
默认情况下,stack 和 queue 都是在 std::deque 之上实现的,如果您不更改此设置,它们应该具有相似的性能。
这实际上取决于您正在编写什么样的应用程序,您可以选择最有利于那些您想要的操作的底层容器。
【讨论】:
它们都具有恒定的复杂性......您只需要计时以确定是否有任何常数更高
http://www.cplusplus.com/reference/stack/stack/pop/
http://www.cplusplus.com/reference/queue/queue/pop/
【讨论】:
队列和堆栈是不同的。 首先是FIFO,栈是FILO
【讨论】: