在C++中限制Queue <T>的大小

Lil*_*ily 19 c++ queue containers limit

我注意到类似问题的线程:在.NET中限制Queue <T>的大小? 这正是我想要做的,但我不是在使用.net而是使用GNU C++.我没有引用GNU C++中的基类,所以像java super.***()或.net之类的java base.***()将不起作用.我一直试图从队列类继承,但事实证明是徒劳的.

我想做的事:指定队列的大小,并在队列满时自动出队.具体来说:如果队列的最大大小为2,当我按下第3项时,第1项将在推送新项目之前自动弹出.

如何实现这样的队列?

谢谢.

Eng*_*eer 15

我知道你说"自动",但是,为了简单起见: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);
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*ink 13

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

  • 我不同意这个解决方案,因为它可以防止在需要std lib队列的情况下使用这个队列(比如:`template <typename T,class C> void f(std :: queue <T,C>&)`).OTOH,使用带有不同底层容器的`std :: queue将允许使用具有足够通用代码的队列,该代码需要std lib队列. (3认同)
  • 你的意思是:用成员变量队列创建一个新类? (2认同)

Mic*_*urr 8

听起来像boost :: circuclar_buffer可以满足您的需求:

写入完整缓冲区

如果数据源产生的数据多于固定大小的缓冲区中的数据,则有几种选择如何处理这种情况:

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

很明显, circular_buffer实现了第三种选择.但它可能不太明显,它没有实施任何其他选择 - 尤其是前两个.人们可以得到一个印象,即 circular_buffer应该实施前三个选项并提供一种选择它们的机制.这种印象是错误的.的 circular_buffer设计和优化为圆形(这意味着完整的时覆盖最旧的数据).如果启用了这样一种控制机制,它只会使问题复杂化,并且使用circular_buffer它可能不那么简单.