Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 限制队列大小<;T>;在C++;_C++_Queue_Limit_Containers - Fatal编程技术网

C++ 限制队列大小<;T>;在C++;

C++ 限制队列大小<;T>;在C++;,c++,queue,limit,containers,C++,Queue,Limit,Containers,我注意到类似问题的线索: 这正是我想要做的,但是我不使用.NET,而是GNU C++。我没有引用GNU C++中的基类,所以java类似的代码>超级***()或.NET类 Base.**()不会工作。我一直试图从队列类继承,但结果是徒劳的 我想做的是: 指定队列的大小,并在队列已满时自动出列。具体来说:如果我的队列的最大大小是2,当我推送第三个项目时,第一个项目将在推送新项目之前自动弹出 如何实现这样的队列 谢谢。创建一个新类来封装队列,并在新类中强制执行大小限制。假设queue的意思是std:

我注意到类似问题的线索: 这正是我想要做的,但是我不使用.NET,而是GNU C++。我没有引用GNU C++中的基类,所以java类似的代码>超级***()或.NET类<代码> Base.**()不会工作。我一直试图从队列类继承,但结果是徒劳的

我想做的是: 指定队列的大小,并在队列已满时自动出列。具体来说:如果我的队列的最大大小是2,当我推送第三个项目时,第一个项目将在推送新项目之前自动弹出

如何实现这样的队列


谢谢。

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

假设
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);
    }