【问题标题】:STL deque: keep minimum sizeSTL双端队列:保持最小大小
【发布时间】: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开头。

标签: c++ stl deque


【解决方案1】:

不,你不能总是期待这种行为。这些是特定于实现的细节。我认为标准中没有任何规范要求这种行为。

但是,还有另一种解决方案。您可以在 boost 中使用循环缓冲区。 (文档:https://www.boost.org/doc/libs/1_67_0/doc/html/circular_buffer.html) 它为您需要的确切功能提供了最优化的实现之一。 它将以给定的大小在构造时分配内存(因为它是您提到的常量)。在调用和 pop_{front/back} 时,它不会释放内存,也不会在 push_{front/back} 上分配。它只是将开始和结束迭代器移动到指向适当的成员。

因此,您需要的所有操作都是 O(1)。它还提供了空间局部性,从而使遍历速度非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多