【问题标题】:Set deque max_size up to maximal size将 deque max_size 设置为最大大小
【发布时间】:2012-10-22 09:16:17
【问题描述】:

据我了解,deque 是一个循环缓冲区,当空间不足时,它会分配新空间(如果可以的话)。有没有办法限制双端队列可以增长到? 或者确保它不会增长到最大大小的唯一方法是每次我想将数据插入到双端队列时检查?

【问题讨论】:

    标签: c++ deque


    【解决方案1】:

    是的,与每个 STL 集合一样,模板化参数之一是分配器。

    因此,您可以编写自己的自定义分配器,该分配器将跟踪内存并在超出此限制时抛出 bad_alloc,即使内存可用。

    顺便说一句,std::deque 通常实现为“页面”的集合,其中每个页面包含固定数量的元素。

    如果你想要一个循环缓冲区实现,你可以在其中插入或删除“任何地方”,std::deque 不是最有效的使用,std::list 会是(尽管你可以使用 boost 中可用的循环集合) .

    【讨论】:

    • cutsom 分配器似乎是解决此问题的错误方法。我知道,在为双端队列请求的内存量和双端队列的大小之间没有严格的关系。例如,向量的大小和容量之间肯定没有这种关系。
    • 您可能指的是双端队列实现本身和分配器之间的关系以及哪个选择页面大小,因此您不能保证完美调整它,但是考虑到限制可能基于您希望为此对象允许的最大内存分配,您的分配器将能够管理它,尽管您可能会发现您实际上无法准确地达到阈值。
    【解决方案2】:

    deque 不是循环缓冲区;它通常实现为数组的链接集合。对于循环缓冲区,请查看 Boost 中的 circular_buffer。

    【讨论】:

      【解决方案3】:

      根据我的经验,最简单的方法是通过包装类封装双端队列并编写两个包装push_back和push_front的成员函数

      【讨论】:

        【解决方案4】:

        双端队列不是循环缓冲区。它可以实现为循环缓冲区,但实现细节对用户是隐藏的。我建议你编写一个包装类或便利函数来为你做大小检查。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-25
          • 2018-06-27
          • 2013-06-25
          • 2012-07-26
          相关资源
          最近更新 更多