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
创建一个封装队列的新类,并在新类中强制执行大小限制.
听起来像boost :: circuclar_buffer可以满足您的需求:
写入完整缓冲区
如果数据源产生的数据多于固定大小的缓冲区中的数据,则有几种选择如何处理这种情况:
- 通知数据源等待缓冲区中有空间(例如,通过抛出溢出异常).
- 如果最旧的数据是最重要的,则忽略源中的新数据,直到缓冲区中再次存在空间.
- 如果最新数据最重要,请写入最旧的数据.
- 让生产者在写入之前负责检查缓冲区的大小.
很明显,
circular_buffer实现了第三种选择.但它可能不太明显,它没有实施任何其他选择 - 尤其是前两个.人们可以得到一个印象,即circular_buffer应该实施前三个选项并提供一种选择它们的机制.这种印象是错误的.的circular_buffer设计和优化为圆形(这意味着完整的时覆盖最旧的数据).如果启用了这样一种控制机制,它只会使问题复杂化,并且使用circular_buffer它可能不那么简单.
| 归档时间: |
|
| 查看次数: |
30300 次 |
| 最近记录: |