当我们已经拥有更强大的向量时,为啥还需要堆栈?
Posted
技术标签:
【中文标题】当我们已经拥有更强大的向量时,为啥还需要堆栈?【英文标题】:Why do we need stacks when we already have vectors which are even more powerful?当我们已经拥有更强大的向量时,为什么还需要堆栈? 【发布时间】:2021-11-03 11:09:18 【问题描述】:在 C++ STL 中,堆栈是使用容器适配器实现的,这些适配器重写了 Vector 类的接口。但是,既然已经有了 Vector 类,为什么还要重写接口并设计一个 Stack 类呢?是因为成本效率,即维护堆栈使用更少的资源,而它可以完成所有必要的工作吗?
【问题讨论】:
注意std::stack
默认使用std::deque
实现
更强大和更灵活并不意味着更好。限制一个类的功能通常意味着更安全或更清晰的代码,这是它自己衡量“更好”的标准。
【参考方案1】:
当我们已经拥有更强大的 goto 时,为什么还需要 for 循环和 while 循环?您应该坚持简约原则 - 使用功能最弱但功能强大到足以实现预期目标的工具。
如果您需要的是堆栈,请依赖提供该功能的标准库类,而不是更强大的。它还可以更好地与阅读您的代码的人交流您将要做什么。
【讨论】:
“交流”位是一个非常好的点。如果我正在调试一个声明std::vector<int> stack
的代码块,我不一定认为该代码将其严格视为堆栈。如果它声明std::stack<int> stack
,我可以相信。【参考方案2】:
容器适配器背后的想法是在其他开放式容器类型上强制执行特定的抽象数据类型。如果您有std::vector
,则可能会无意中在中间插入/擦除/访问元素;但如果你有std::stack
,你就知道这不会发生。类似于const
:你告诉编译器要应用什么限制,这样当你不小心违反它们时它就会告诉你。
IME,人们并不经常使用stack
和queue
。 priority_queue
更有用一点。但在每种情况下,人们往往会发现需要稍微打破规则的奇怪特殊情况,这意味着要放弃原则性过于严格的容器适配器。
【讨论】:
以上是关于当我们已经拥有更强大的向量时,为啥还需要堆栈?的主要内容,如果未能解决你的问题,请参考以下文章