具有覆盖C++的最大大小的堆栈
Stack with maximum size that overwrites C++
如果我正在制作一个类似撤消堆栈的东西,并且我只想支持30个撤消操作,那么最好有一个最大深度为30的堆栈。
在这一点上,你显然不希望堆栈限制添加,你只希望它在添加第31个元素时丢弃最底部的元素。
我知道我可以用列表来模仿这种功能,但我想知道STL是否有办法实现它,或者是否有其他预先实现的选项?
我会使用一个包含30个节点(或元素)的循环链表(或只是一个循环使用的缓冲区)。您可以从同一节点的顶部和底部指针开始,每当添加元素时都会向顶部前进,当删除元素时则会倒退。如果你添加了太多元素,以至于你到达了底部(你已经绕着循环走了一圈),那么你就向前移动顶部和底部指针,这样它们就不会相互交叉,并覆盖底部指针下面的指针(顶部指针现在指向的位置)。
另一种方法是分配一个数组(或环绕一个vector
),而不是动态分配内存,当你想提前一个索引时,用30来模化你的索引。
无论哪种方式,您都不必分配或取消分配内存,除非在一开始,而且您可以很好地处理溢出。您可以在维基百科页面上阅读有关循环缓冲区的详细信息。
当大小超过限制时,我会使用std::deque
并删除元素。当然,正如你所观察到的,一份清单也同样有效。
没有一个标准的容器可以做到这一点。
std::deque
或std::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
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++线程的可用堆栈大小