如果我正在制作类似撤销堆栈的东西,并且我只想支持30次撤消操作,那么拥有最大深度为30的堆栈会很不错。
你显然不希望堆栈在这一点上限制添加,你只是希望它在添加第31个时丢弃最底部的元素。
我知道我可以通过列表模仿这种功能,但我想知道是否有办法让STL实现它,或者是否有其他预先实现的选项?
答案 0 :(得分:6)
我会使用循环链接列表(或者只是循环使用的缓冲区)和30个节点(或元素)。您将在同一节点处开始顶部和底部指针,并在添加元素时前进顶部,并在删除元素时将其退回。如果你添加了很多元素,你到达了底部(你已经绕过循环)然后你推进顶部和底部指针,使它们不会相互交叉,并覆盖底部下面的那个指针(顶部指针现在指向的地方)。
另一种方法是分配一个数组(或环绕vector
),而不是动态分配内存,并在你想推进索引时将索引模型化为30。
无论哪种方式,你都不需要在开始时分配或释放内存,你可以很好地处理溢出。您可以在Wikipedia page about circular buffers上阅读详细信息。
答案 1 :(得分:1)
我会使用std::deque
并在大小超过限制时删除元素。当然,正如您所观察到的那样,列表也可以正常工作。
没有标准的容器可以做到这一点。
答案 2 :(得分:1)
std::deque
或std::list
都有效。您可以使用push_back
/ pop_back
将它们用作堆栈,并使用pop_front
答案 3 :(得分:1)
如果您愿意在STL之外工作,那么boost会有一个名为circular_buffer
的容器,可以满足您的需求:
http://www.boost.org/doc/libs/1_49_0/libs/circular_buffer/doc/circular_buffer.html#briefexample
答案 4 :(得分:0)
我不知道你是否想这样做,但在我看来你想要一个循环缓冲区。它不是STL afaik,但它会完全符合您的要求。看看http://en.wikipedia.org/wiki/Circular_buffer