C++ 限制队列大小<;T>;在C++;
我注意到类似问题的线索: 这正是我想要做的,但是我不使用.NET,而是GNU C++。我没有引用GNU C++中的基类,所以java类似的代码>超级***()或.NET类<代码> Base.**()不会工作。我一直试图从队列类继承,但结果是徒劳的 我想做的是: 指定队列的大小,并在队列已满时自动出列。具体来说:如果我的队列的最大大小是2,当我推送第三个项目时,第一个项目将在推送新项目之前自动弹出 如何实现这样的队列C++ 限制队列大小<;T>;在C++;,c++,queue,limit,containers,C++,Queue,Limit,Containers,我注意到类似问题的线索: 这正是我想要做的,但是我不使用.NET,而是GNU C++。我没有引用GNU C++中的基类,所以java类似的代码>超级***()或.NET类 Base.**()不会工作。我一直试图从队列类继承,但结果是徒劳的 我想做的是: 指定队列的大小,并在队列已满时自动出列。具体来说:如果我的队列的最大大小是2,当我推送第三个项目时,第一个项目将在推送新项目之前自动弹出 如何实现这样的队列 谢谢。创建一个新类来封装队列,并在新类中强制执行大小限制。假设queue的意思是std:
谢谢。创建一个新类来封装队列,并在新类中强制执行大小限制。假设
queue
的意思是std::queue
:队列只是编译时传递的某个底层容器的适配器。你可以使用一个已经做了你想做的事情的容器。如果您能找到一个支持std::queue
所需操作的循环缓冲区,那么最合适的似乎是循环缓冲区(我认为这是push_back()
、pop_front()
和size()
,但我还没有检查) 听起来像是在做你想做的事情:
写入满缓冲区
如何应对,有几种选择
如果一个数据源
生成的数据超出了存储空间的容量
固定大小的缓冲区:
circular\u buffer
实现第三个
选项但它可能不那么明显
不实施任何其他选项-
特别是前两个。可以得到
给人的印象是
循环缓冲区应执行
前三个选项,并提供
其中的选择机制。这
印象是错误的。这个
循环缓冲区的设计与实现
优化为圆形(这意味着
在以下情况下覆盖最旧的数据:
完整的)。如果有这样的控制机制,
如果已启用,它将
使事情和用法复杂化
循环缓冲区
的
可能不那么直截了当
我知道你说的是“自动”,但为了简单起见:只将Enqueue()
ing封装在本地函数中(不,不是干净的OO,但它可以工作):
Queue myQueue=new Queue();
void addToMyQueue(T参数)
{
myQueue.Enqueue(param);//或push(param)
如果(myQueue.Count>限制)
myQueue.Dequeue();//或pop()
}
void main()
{
addToMyQueue(param);
}
你需要解释一下“自动出列”是什么意思?你是说在队列的最前面丢弃东西吗?@Neil:我正要问同样的问题,但我先在链接的帖子上点击了:)
你的意思是:用成员变量队列创建一个新类吗?@Lily,我相信这就是他的意思。这相当简单,因为队列实际上只有两个重要的变种,push_back和pop_front。在您的情况下,如果它自动出列,您可能只需要作为公共成员推回。我不同意这种解决方案,因为它阻止在需要std lib队列的地方使用此队列(如:templatevoid f(std::queue&)
)。OTOH,将`std::queue与不同的底层容器一起使用,将允许使用具有足够通用性的代码的队列,该代码期望使用std-lib队列。它是一个标准队列,可以实现此目的(即固定大小的队列)。我说这是最干净的解决方案。顺便说一下,这更可能是Java的格式。类是queue,初始化不需要新的,只需要queue myQueue;这就足够了,您需要使用push、pop和size来代替这些方法。
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);
}