我注意到类似问题的主题:Limit size of Queue<T> in .NET?
这正是我想要做的,但我不是在使用.net而是使用GNU C ++。我没有引用GNU C ++中的基类,因此像super.***()
这样的java或像base.***()
这样的.net将不起作用。我一直试图从队列类继承,但事实证明是徒劳的。
我想做什么: 指定队列的大小,并在队列满时自动出队。具体来说:如果队列的最大大小为2,当我按下第3项时,第1项将在推送新项目之前自动弹出。
如何实现这样的队列?
感谢。
答案 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可以满足您的需求:
写入完整缓冲区
如何应对有多种选择 如果是数据源的情况 产生的数据超出了可以容纳的数据 固定大小的缓冲区:
- 通知数据源要等到 缓冲区中有空间(例如,通过 抛出溢出异常)。
- 如果最旧的数据最多 重要的是,忽略来自的新数据 来源,直到有空间 缓冲再次。
- 如果最新的数据是最重要的,请写下来 最古老的数据
- 让生产者成为 负责检查大小 写入之前的缓冲区。
醇> 很明显,circular_buffer
实现了第三个 选项。但它可能不太明显 没有实施任何其他选择 - 特别是前两个。一个人可以得到 一种印象circular_buffer
应该实施 前三个选项并提供一个 选择机制。这个 印象是错误的。该circular_buffer
的设计和目标 优化为圆形(这意味着 在何时覆盖最旧的数据 充分)。如果有这样的控制机制 已启用,它会 使事情和用法复杂化 将circular_buffer
可能不太直白。
答案 3 :(得分:0)
假设Queue<T>
表示std::queue<T>
:队列只是在编译时传递的某个底层容器的适配器。您可以使用已经完成所需操作的容器。最好的拟合似乎是一个循环缓冲区,如果你能找到一个支持std::queue
所需操作的那个(我认为那是push_back()
,pop_front()
和size()
,但是我没有检查过)。