【问题标题】:C++ std::stack TraversalC++ std::stack 遍历
【发布时间】:2013-12-01 01:41:34
【问题描述】:

我在一个项目中使用std::stack,我需要在它上面检查相同的值。我检查了成员函数,但找不到适合此任务的成员函数。

提出的第一个想法是使用复制堆栈,但是在这种情况下程序可能会浪费大量额外空间,并且在项目的这个级别不使用用户定义的堆栈类很重要(是的,我做了一个设计错误...)。

那么,有什么想法吗?

谢谢!

【问题讨论】:

  • 堆栈是错误的数据结构。堆栈中项目的顺序是否重要?

标签: c++ stack std


【解决方案1】:

避免使用std::stack,它只是一个无用的包装器,会降低底层容器的接口。使用 std::vectorpush_back/pop_back 进行插入插入/移除(插入/移除在末端摊销 O(1))或 std::deque,因此您可以在任一侧推/弹出而不显着更改性能(仍然摊销 O(1))。在这两种情况下,您都可以使用它们的随机访问迭代器遍历所有元素。

(同样适用于std::queue:没用,直接使用std::deque不是向量)和push_back/pop_front

【讨论】:

  • 我不知道vector有这些方法。再次感谢您。
  • 一个std::stack 不是没用的。是的,与底层容器相比,它的功能大大减少了,但这也是它的优势:它只是一个堆栈,如果这就是一个人所需要的,那么这使得程序比使用更清晰,更易于维护,比如说,std::deque
  • @Walter:请提供一个实际使程序“更清洁、更易于维护”的案例;以我的经验,它只会让我浪费大量时间将pop 重命名为pop_backpushpush_backtoptop 以任何原因需要访问底层容器时(因为哦- 非常罕见的场景,例如在算法的第一部分将元素累积到堆栈后迭代元素;打印堆栈内容以进行日志记录/调试;将完整堆栈传递给任何其他函数以处理元素;查看超过顶部的一个元素)。
  • @DavidRector:这里没有汽车,只有一辆不错的普通卡车,装载区焊接在一起,让您只能装载小包。
  • @DavidRector:该类不是更轻量级或其他任何东西,因为它下面有std::vectorstd::deque 或您作为模板参数传递给它的任何东西,它只是限制了底层的接口容器。与 deque 的类比是无用的,因为它不是 KD-tree 不成立 - deque 是与 KD-tree 不同的数据结构,std::stack 字面意思 std::vector 锁定在一个愚蠢的界面。
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 2020-06-11
  • 1970-01-01
  • 2014-04-12
  • 2018-05-05
  • 2020-11-07
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多