【问题标题】:Removing the first element from a queue?从队列中删除第一个元素?
【发布时间】:2012-05-29 19:16:47
【问题描述】:

我有一个队列。如果它超过 X 大小,当我推送一个元素时,我想删除队列的第一个元素。 (将弹出的最后一个元素和推入的第一个元素)

void ClientPlayerManager::queueTableMessage( const std::string& playerName, const std::string& message )
{
    m_tableQ.push(std::make_pair(playerName,message));

    if(m_tableQ.size() > m_maxTableMessages)
    {
        //m_tableQ.pop_back(); does not exist
    }
}

有没有办法用标准队列做到这一点?

谢谢

【问题讨论】:

  • 在 FIFO 队列中,最后一个被弹出的元素与第一个被推入的元素在另一端。你想要哪个?
  • 是的,这很令人困惑。为什么不直接使用 push 和 pop 而忘记它呢?

标签: c++ data-structures queue


【解决方案1】:

您可以使用std::deque 代替std::queue,后者支持push_frontpush_backpop_frontpop_back。这也允许在整个过程中进行随机访问,但您可以忽略它并将deque 视为双端队列。 (其实deque是双端队列的缩写)。

希望这会有所帮助!

【讨论】:

  • 是的,这正是我所需要的。谢谢。
【解决方案2】:

如果你想从pop 的另一端删除一个元素,只需跳过一开始就推送它:

if(m_tableQ.size() < m_maxTableMessages) {
    m_tableQ.push(std::make_pair(playerName,message));
}

【讨论】:

  • 不,我的想法是我希望保留前 X 条消息,当我有 X 条消息时,最不重要的一条(最旧的一条)会消失,而新的一条会进入。
  • @Milo:在这种情况下,您可以使用pop
【解决方案3】:

Here 是另一种方法。使用基于 STL 的队列实现。

【讨论】:

  • 很抱歉,但我不明白这是如何回答问题的。大概 OP 已经在使用 std::queue 但想从中删除最后一个元素,std::queue 并不自然支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多