具有覆盖C++的最大大小的堆栈

Stack with maximum size that overwrites C++

本文关键字:堆栈 C++ 覆盖      更新时间:2023-10-16

如果我正在制作一个类似撤消堆栈的东西,并且我只想支持30个撤消操作,那么最好有一个最大深度为30的堆栈。

在这一点上,你显然不希望堆栈限制添加,你只希望它在添加第31个元素时丢弃最底部的元素。

我知道我可以用列表来模仿这种功能,但我想知道STL是否有办法实现它,或者是否有其他预先实现的选项?

我会使用一个包含30个节点(或元素)的循环链表(或只是一个循环使用的缓冲区)。您可以从同一节点的顶部和底部指针开始,每当添加元素时都会向顶部前进,当删除元素时则会倒退。如果你添加了太多元素,以至于你到达了底部(你已经绕着循环走了一圈),那么你就向前移动顶部和底部指针,这样它们就不会相互交叉,并覆盖底部指针下面的指针(顶部指针现在指向的位置)。

另一种方法是分配一个数组(或环绕一个vector),而不是动态分配内存,当你想提前一个索引时,用30来模化你的索引。

无论哪种方式,您都不必分配或取消分配内存,除非在一开始,而且您可以很好地处理溢出。您可以在维基百科页面上阅读有关循环缓冲区的详细信息。

当大小超过限制时,我会使用std::deque并删除元素。当然,正如你所观察到的,一份清单也同样有效。

没有一个标准的容器可以做到这一点。

std::dequestd::list都能工作。您可以使用push_back/pop_back将它们用作堆栈,并使用pop_front 使旧元素过期

如果您愿意在STL之外工作,boost有一个名为circular_buffer的容器,非常适合您的需求:http://www.boost.org/doc/libs/1_49_0/libs/circular_buffer/doc/circular_buffer.html#briefexample

我不知道你是否想这样做,但在我看来,你想要一个循环缓冲区。它不是STL afaik,但它会做你想做的事。看看http://en.wikipedia.org/wiki/Circular_buffer