【问题标题】:limit size of Queue<T> in C++C++ 中 Queue<T> 的限制大小
【发布时间】:2010-11-19 08:54:00
【问题描述】:

我注意到类似问题的线程:Limit size of Queue<T> in .NET? 这正是我想要做的,但我使用的不是 .net,而是 GNU C++。我没有引用 GNU C++ 中的基类,因此 super.***() 之类的 java 或 base.***() 之类的 .net 将不起作用。我一直在尝试从队列类继承,但结果是徒劳的。

我想做什么: 指定队列的大小,当队列满时自动出队。具体来说:如果我的队列的最大大小为2,当我推送第3个项目时,会在推送新项目之前自动弹出第1个项目。

如何实现这样的队列?

谢谢。

【问题讨论】:

  • 你需要解释一下你所说的“自动出队”是什么意思——你的意思是丢弃队列头部的东西吗?
  • @Neil:我正要问同样的问题,但后来我首先点击了链接的帖子。 :)

标签: c++ queue limit containers


【解决方案1】:

创建一个封装队列的新类并在新类中强制执行大小限制。

【讨论】:

  • 你的意思是:用成员变量队列创建一个新类吗?
  • @Lily,我相信这就是他的意思。这相当简单,因为一个队列实际上只有两个重要的修改器,push_back 和 pop_front。在您的情况下,如果它自动出列,您可能只需要 push_back 作为公共成员。
  • 我不同意这个解决方案,因为它阻止了在需要 std lib 队列的地方使用这个队列(比如:template&lt; typename T, class C&gt; void f(std::queue&lt;T,C&gt;&amp;))。 OTOH,将 `std::queue 与不同的底层容器一起使用将允许将该队列与足够通用的代码一起使用,该代码需要标准库队列。
  • “创建一个封装队列的新类并在新类中强制执行大小限制”。这意味着提供您自己的推送(和弹出)API 实现,并检查最大大小(推送中)。
【解决方案2】:

我知道您说的是“自动”,但是,为了简单起见:仅将 Enqueue()ing 封装在本地函数中(不,不是干净的 OO,但它有效):

Queue<T> myQueue = new Queue<T>();

void addToMyQueue(T param)
{
   myQueue.Enqueue(param); //or push(param)
   if (myQueue.Count > LIMIT)
      myQueue.Dequeue(); //or pop()
}

void main()
{
   addToMyQueue(param);
}

【讨论】:

  • 这是一个标准队列,它实现了目的(即队列的固定大小)。我说这是最干净的解决方案。
  • 顺便说一句,这更有可能是 Java 的格式。类是队列,初始化不需要new,只需要queue myQueue;就足够了,您需要使用 push、pop 和 size 而不是这些方法。
【解决方案3】:

听起来boost::circuclar_buffer 符合您的要求:

写入一个完整的缓冲区

有几种选择如何应对 如果是数据源的话 产生的数据超出了 固定大小的缓冲区:

  1. 通知数据源等到 缓冲区中有空间(例如,通过 抛出溢出异常)。
  2. 如果最旧的数据是最 重要的是,忽略来自 源直到有空间 再次缓冲。
  3. 如果最新数据最重要,请覆盖 最旧的数据。
  4. 让生产者成为 负责检查大小 写入之前的缓冲区。

很明显, circular_buffer 实现第三个 选项。但它可能不太明显 不实现任何其他选项 - 尤其是前两个。一个可以得到 一个印象是 circular_buffer 应该执行 前三个选项并提供一个 它们之间的选择机制。这 印象是错误的。这 circular_buffer 的设计和 优化为圆形(这意味着 覆盖最旧的数据时 满的)。如果有这样的控制机制 已启用,它只会 使事情和用法复杂化 的circular_buffer 将是 可能不那么直截了当。

【讨论】:

    【解决方案4】:

    假设Queue&lt;T&gt; 你的意思是std::queue&lt;T&gt;:队列只是一些在编译时传递的底层容器的适配器。您可以使用已经完成您想要的操作的容器。最合适的似乎是一个循环缓冲区,如果你能找到一个支持std::queue 所需操作的缓冲区(我认为这是push_back()pop_front()size(),但我还没有检查)。

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多