队列的限制大小 在 C++

发布于 2024-07-30 12:44:00 字数 427 浏览 8 评论 0原文

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

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

如何实现这样的队列呢?

谢谢。

I notice the thread of similar question: Limit size of Queue<T> in .NET?
That's exactly what I want to do, but I am not using .net but GNU C++. I have no reference to the base class in GNU C++, so java like super.***() or .net like base.***() will not work. I have been trying to inherit from queue class but it turns out in vain.

What I want to do:
specify the size of the queue, and automatically dequeue when the queue is full. To be specific: if the maximum size of my queue is 2, when I push the 3rd item, the 1st item will be automatically popped out before pushing the new item.

How to implement such a queue?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

烟酒忠诚 2024-08-06 12:44:00

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

Make a new class that encapsulates the queue and enforce a size limit in the new class.

寒尘 2024-08-06 12:44:00

我知道你说的是“自动”,但是,为了简单起见:将 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);
}

I know you said "automatic", but, to keep things simple: Encapsulate just the Enqueue()ing in a local function (no, not clean OO, but it works):

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);
}
我爱人 2024-08-06 12:44:00

听起来 boost::circuclar_buffer 做了什么您正在寻找:

写入已满的缓冲区

有几种应对方法
与数据源的情况
产生的数据超出了可容纳的范围
固定大小的缓冲区:

  1. 通知数据源等待
    缓冲区中有空间(例如
    抛出溢出异常)。
  2. 如果最旧的数据是最多的
    重要的是,忽略来自
    源,直到有空间
    再次缓冲。
  3. 如果最新数据最重要,请覆盖
    最旧的数据。
  4. 让制作人成为
    负责检查尺寸
    写入之前的缓冲区。

很明显,
circular_buffer 实现了第三个
选项。 但可能不太明显
不实施任何其他选项 -
尤其是前两个。 一个可以得到
印象是
circular_buffer 应该实现
前三个选项并提供
其中的选择机制。 这
印象是错误的。 这
circular_buffer 的设计和
优化为圆形(这意味着
覆盖最旧的数据时
满的)。 如果有这样的控制机制
已启用,它只会
使事情和使用变得复杂
circular_buffer 的值是
可能不那么简单。

It sounds like boost::circuclar_buffer does what you're looking for:

Writing to a Full Buffer

There are several options how to cope
with the case if a data source
produces more data than can fit in the
fixed-sized buffer:

  1. Inform the data source to wait until
    there is room in the buffer (e.g. by
    throwing an overflow exception).
  2. If the oldest data is the most
    important, ignore new data from the
    source until there is room in the
    buffer again.
  3. If the latest data is the most important, write over the
    oldest data.
  4. Let the producer to be
    responsible for checking the size of
    the buffer prior writing into it.

It is apparent that the
circular_buffer implements the third
option. But it may be less apparent it
does not implement any other option -
especially the first two. One can get
an impression that the
circular_buffer should implement
first three options and offer a
mechanism of choosing among them. This
impression is wrong. The
circular_buffer was designed and
optimized to be circular (which means
overwriting the oldest data when
full). If such a controlling mechanism
had been enabled, it would just
complicate the matters and the usage
of the circular_buffer would be
probably less straightforward.

离去的眼神 2024-08-06 12:44:00

假设 Queue 您的意思是 std::queue:队列只是在编译时传递的某些底层容器的适配器。 您可以使用已经可以实现您想要的功能的容器。 如果您能找到一个支持 std::queue 所需操作的循环缓冲区,那么最合适的似乎是循环缓冲区(我认为这是 push_back()pop_front()size(),但我还没有检查)。

Assuming that by Queue<T> you mean std::queue<T>: A queue is just an adapter for some underlying container that's passed at compile-time. You could use a container that already does what you want. The best fit seems to be a circular buffer, if you can find one that supports the operations necessary for std::queue (I think that's push_back(), pop_front(), and size(), but I haven't checked).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文