【问题标题】:Can I erase a node in the middle of a std::queue?我可以擦除 std::queue 中间的节点吗?
【发布时间】:2020-05-11 03:05:22
【问题描述】:

如果我有一个std:queue,我可以删除中间的一个元素吗?

还是我应该选择一个简单的向量?

编辑:

最后,我的搜索介于std::liststd::deque 之间。 this post 给出了一个很好的比较,尽管我仍然有点犹豫不决。

一方面,由于删除后我不会访问更多成员(操作完成),我并不担心迭代器失效。 另一方面,我可能会一个一个地访问(或搜索)元素,所以随机访问可能没那么重要……

【问题讨论】:

标签: c++ containers


【解决方案1】:
  1. 不,除非您想取出所有元素并重新放入。

  2. std::list 可能会更好,但这取决于您还想用它做什么。

【讨论】:

  • 我想做一个队列的常见操作加上偶尔删除中间元素(需要找到所述元素)。我听说双端队列可能会有所帮助。你怎么看?
  • 查看stackoverflow.com/questions/4010097/…,其中包含一个方便的流程图,说明哪些容器可能适合您的需求
  • @Tas 谢谢。我这样做了,我得到了std::list。所以现在我在列表、向量或双端队列之间......:)
  • 向量适用于堆栈但不适用于队列,向量仅允许在后面有效地添加/删除,但队列需要删除插入位置的另一端的元素。 deque 和 list 都适用于队列。并且根据对象类型, boost.intrusive 中也有等价的类型。
  • @SornelHaetir 这是个好建议!所以在我的情况下,向量应该是出来的。现在我的选择在std::liststd:deque之间...要删除中间的成员我首先要找到它,所以还需要一些简单的搜索
【解决方案2】:

std:: queue 是一个容器适配器,即它以“先进先出”的特定顺序处理元素。你为什么要打破这个秩序?首先,您不能从std:: queue 的任何位置擦除元素,除了front 结束(除非您使用另一个辅助数据结构)。如果您想要类似的功能,那么甚至在std:: list 之前就盲目地使用std:: vector。分析您的代码,如果您觉得需要std:: list,那就去吧。

【讨论】:

  • 明白你的意思,谢谢!。刚刚有人告诉我,vector 可以在后面有效地移除,所以它们不适合我的需要。我现在介于列表和双端队列之间。
  • @KansaiRobot 你应该选择deque,然后,根据我的经验,deque 被证明是灵活且易于使用的。虽然不能说太多。
  • @KansaiRobot std::deque 在 FIFO(先进先出)和随机访问之间取得了很好的平衡。如果您两者都需要,std::deque 绝对是您的最佳选择。
猜你喜欢
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2012-11-25
  • 2014-01-12
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
相关资源
最近更新 更多