使用双端队列时,使用push_back()/pop_front()还是push_front()/pop_back()更好?

3

当使用std :: deque作为FIFO时,哪对push / pop函数更好?

  • push_back(),pop_front()
  • push_front(),pop_back()

我怀疑效率方面没有区别,但至少哪个是最“惯用”的(即大多数程序员使用的)?

谢谢


当使用std::deque作为FIFO时,停在这里。如果你实际上不想使用两端,为什么选择双端队列呢? - Lightness Races in Orbit
1
有一些特殊情况下,我需要完全访问两端,但大部分时间它会像一个普通的先进先出队列一样运行。 - Jasancos
3个回答

4

deque并不是一个容器用于实现FIFO,因此不能有一种惯用的方法来使用它实现FIFO。如果您需要FIFO,请使用std::queue。如果您坚持使用deque来实现它,那么任何一个提出的解决方案都同样适用。


@Drax 我已经完全修改了我的答案,第一个版本提出了一种实现LIFO而不是FIFO的方法。 - Ivaylo Strandjev
2
我认为第一句话可能措辞过于强烈了:因为std::queue的标准声明是template <class T, class Container = deque<T> > class queue;,而它的定义只不过是将push别名为push_back,将pop别名为pop_front,所以说deque不能用来实现queue几乎是错误的。 - jthill
@jthill队列是FIFO(先进先出)的一种实现,无论其底层容器如何,双端队列是一个提供了队列所有功能以及额外操作的容器。因此,双端队列并不比队列更优于实现FIFO。此外,你不应忽视使用队列在可读性和可维护性方面更好 - 任何人都知道队列是FIFO,而很难发现双端队列被用作FIFO。 - Ivaylo Strandjev
如果您还需要对FIFO进行索引,那么我认为std::deque是更好的选择。 - Assil Ksiksi

3
大多数std::queue实现似乎使用:

push_back(),pop_front()

顺便说一下,如果您可以的话,最好直接使用std :: queue。

2

编写一个循环并计时两种方式

只有两个选择,你应该能够得到最适合你的架构和编译器版本的最佳答案

最好不要假设任何关于效率的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接