【发布时间】:2013-12-01 01:41:34
【问题描述】:
我在一个项目中使用std::stack,我需要在它上面检查相同的值。我检查了成员函数,但找不到适合此任务的成员函数。
提出的第一个想法是使用复制堆栈,但是在这种情况下程序可能会浪费大量额外空间,并且在项目的这个级别不使用用户定义的堆栈类很重要(是的,我做了一个设计错误...)。
那么,有什么想法吗?
谢谢!
【问题讨论】:
-
堆栈是错误的数据结构。堆栈中项目的顺序是否重要?
我在一个项目中使用std::stack,我需要在它上面检查相同的值。我检查了成员函数,但找不到适合此任务的成员函数。
提出的第一个想法是使用复制堆栈,但是在这种情况下程序可能会浪费大量额外空间,并且在项目的这个级别不使用用户定义的堆栈类很重要(是的,我做了一个设计错误...)。
那么,有什么想法吗?
谢谢!
【问题讨论】:
避免使用std::stack,它只是一个无用的包装器,会降低底层容器的接口。使用 std::vector 和 push_back/pop_back 进行插入插入/移除(插入/移除在末端摊销 O(1))或 std::deque,因此您可以在任一侧推/弹出而不显着更改性能(仍然摊销 O(1))。在这两种情况下,您都可以使用它们的随机访问迭代器遍历所有元素。
(同样适用于std::queue:没用,直接使用std::deque(不是向量)和push_back/pop_front)
【讨论】:
std::stack 不是没用的。是的,与底层容器相比,它的功能大大减少了,但这也是它的优势:它只是一个堆栈,如果这就是一个人所需要的,那么这使得程序比使用更清晰,更易于维护,比如说,std::deque。
pop 重命名为pop_back、push 至push_back 和top 至top 以任何原因需要访问底层容器时(因为哦- 非常罕见的场景,例如在算法的第一部分将元素累积到堆栈后迭代元素;打印堆栈内容以进行日志记录/调试;将完整堆栈传递给任何其他函数以处理元素;查看超过顶部的一个元素)。
std::vector 或std::deque 或您作为模板参数传递给它的任何东西,它只是限制了底层的接口容器。与 deque 的类比是无用的,因为它不是 KD-tree 不成立 - deque 是与 KD-tree 不同的数据结构,std::stack 字面意思 std::vector 锁定在一个愚蠢的界面。