限制C ++中队列<t>的大小</t>

时间:2009-08-13 16:16:33

标签: c++ queue limit containers

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

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

如何实现这样的队列?

感谢。

4 个答案:

答案 0 :(得分:14)

我知道你说“自动”,但是,为了简单起见:在本地函数中封装Enqueue()(不,不是干净的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);
}

答案 1 :(得分:13)

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

答案 2 :(得分:8)

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

  

写入完整缓冲区

     

如何应对有多种选择   如果是数据源的情况   产生的数据超出了可以容纳的数据   固定大小的缓冲区:

     
      
  1. 通知数据源要等到   缓冲区中有空间(例如,通过   抛出溢出异常)。
  2.   
  3. 如果最旧的数据最多   重要的是,忽略来自的新数据   来源,直到有空间   缓冲再次。
  4.   
  5. 如果最新的数据是最重要的,请写下来   最古老的数据
  6.   
  7. 让生产者成为   负责检查大小   写入之前的缓冲区。
  8.         很明显,   circular_buffer实现了第三个   选项。但它可能不太明显   没有实施任何其他选择 -   特别是前两个。一个人可以得到   一种印象   circular_buffer应该实施   前三个选项并提供一个   选择机制。这个   印象是错误的。该   circular_buffer的设计和目标   优化为圆形(这意味着   在何时覆盖最旧的数据   充分)。如果有这样的控制机制   已启用,它会   使事情和用法复杂化   将circular_buffer   可能不太直白。

答案 3 :(得分:0)

假设Queue<T>表示std::queue<T>:队列只是在编译时传递的某个底层容器的适配器。您可以使用已经完成所需操作的容器。最好的拟合似乎是一个循环缓冲区,如果你能找到一个支持std::queue所需操作的那个(我认为那是push_back()pop_front()size(),但是我没有检查过)。