为什么std::queue没有实现insert()而std::deque有呢?

4

1
一个“队列”具有有限的接口,用于那些不希望使用“双端队列”的全部功能的情况。它是一种抽象。 - Bo Persson
@BoPersson 我真的不太明白。为什么我不想使用deque的超级赛亚人力量呢?也许这两种数据结构在性能方面有一些差异? - justHelloWorld
@justHelloWorld std::queue 是一个高级容器,具有底层容器,可能或可能不会有效地实现插入,因此它并不是一个已知性能的数据结构。 - Kinan Al Sarmini
@justHello - 有时候最好不要使用最大的工具,就像不用链锯来切小树枝一样。如果你使用一个更小的接口,你也会限制可能出现的错误数量,这可以使代码更容易理解。std::queue 不会让任何人“插队”并在中途进入队列,这可能是你想要的限制。 - Bo Persson
2个回答

1

插入允许将内容插入到结构的任意位置。

std::queue 是一个FIFO结构的抽象接口。您只能将内容添加到末尾。底层结构不一定具有向任意位置插入的有效方法(例如考虑std::vector)。因此,std::queue 没有通用的插入成员函数。

由于通用插入函数需要迭代器位置参数,因此多次插入提供了方便,这样您就不必跟踪下一个迭代器位置。推回没有这个需求,因为不需要迭代器跟踪,简单的循环就足够了。


这是一个很好的答案,现在我明白了,我没有想到那么显然:使用insert可以在队列中任何位置插入元素,而我一直在考虑“只能在队列顶部插入”。顺便说一下,他们本来可以实现这样的方法(也许可以通过某种优化而不是简单的push循环)。 - justHelloWorld
@justHelloWorld 他们本来可以这样做,而且我认为这也不是一个非常糟糕的想法。然而,在大多数情况下,性能提升可能只会很小。 - eerorika

0

std::queue是一个适配器,旨在限制为push/pop接口。即使std::vector是底层实现,它也不会暴露insert

没有特定的性能原因,仅仅是一种设计方法:如果你认为你的容器是一个队列,你就不会暴露你不需要的接口。


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