【发布时间】:2016-02-11 14:05:06
【问题描述】:
我使用的是 STL 双端队列结构,在算法的每次迭代中,我从前面删除 n 元素并在末尾添加 n 元素。所以,基本上,我的双端队列大小永远不会改变,我正在进行数百万次迭代。
有没有办法确保内存大小在其生命周期内不会改变(或至少不会下降)?也许由于双端队列的底层实现,这可能是不可避免的,但我想确定一下。
【问题讨论】:
-
您正在寻找的是循环缓冲区或环形缓冲区。
std::deque没有实现这一点,您的场景肯定会经常需要分配和解除分配。看看Boost.Circular Buffer - 如果你不喜欢 boost,或者想实现自己的循环缓冲区,文档仍然值得一读。它解释了这种缓冲区是如何工作的。它可以很容易地用std::vector实现。 -
@Luca 查看我最近的评论编辑。不,不是 STL 本身,而是 boost,在某些部分是“准预标准”。
-
将向量用作循环缓冲区实现的基础的想法是将其“用作环”。因此,您不会从一开始就删除元素,而只是“旋转”开始索引。这会在末尾留出空间来添加新元素。这意味着,循环缓冲区中的索引和向量中的索引具有不同的偏移量。阅读 Boost.Circular Buffer 的文档,你就明白我的意思了。
-
@Luca 您不必从向量中删除元素,例如可以将它们替换为空元素,然后将迭代器保持在头部和尾部。
-
您当然可以使用任意数量的基本容器来实现循环缓冲区,但
vector将是最有效的。不要以deque开头。