2

我知道堆栈/队列是使用 deque 作为其默认底层容器的容器适配器。但是,当我们可以将 deque 用作堆栈或队列时,为什么会有麻烦呢?而且我也没有看到我们必须将堆栈/队列与除 deque 之外的不同底层容器一起使用的情况。此外,堆栈/队列(带有底层双端队列)是否比双端队列花费更多的内存?(数据结构更复杂,所以它必须这样做,对吧?)。如果是这样,那么如果数据很大,那么差异是否很大?

编辑:为什么这个问题被标记为重复并链接到 c++ deque vs queue vs stack?我没有问 deque 和 queue 之间的区别(正如我已经知道的那样)。我问为什么不使用双端队列作为堆栈/队列而不是使用类堆栈/队列,以及其他一些关于内存消耗的问题。

4

2 回答 2

4

如果您需要堆栈或队列,请使用正确的容器。它们旨在防止在 a 上允许的某些操作deque,例如在中间添加或删除元素,甚至遍历容器。这样的操作在严格的堆栈或队列实现中是完全不可接受的。

您可能认为使用 a很好,deque因为知道您打算将它用作普通队列。但是当其他人几年后出现并且您的项目显着增长时,对那个人来说可能根本不明显仅仅因为他们可以解决其他问题而进行非队列操作,您的程序可能会在不经意间以微妙的方式被破坏,这些方式可能会在数周、数月或数年内未被发现。

于 2013-11-28T03:37:00.000 回答
2

容器适配器用于它们的接口。是的,您可以std::deque直接使用,但您不必担心大部分底层容器,而是您有一个用于堆栈/队列的接口(行为)。适配器使容器适应给你特定的行为,它使你更容易根据数据结构(即堆栈或队列)来思考。对于一个stackqueue容器适配器,接口是底层容器提供的一个受限制的子集,这也可以防止错误或以非预期的方式使用容器。

于 2013-11-28T03:35:00.457 回答