【问题标题】:Advantages of Setting priority_queue Container设置 priority_queue 容器的优点
【发布时间】:2012-03-31 17:43:21
【问题描述】:

使用 stl priority_queue 可以设置底层容器,例如 vector。为 stl priority_queue 指定容器有哪些好处?

【问题讨论】:

    标签: c++ stl priority-queue


    【解决方案1】:

    设置底层容器可以分离出两个逻辑上独立的关注点:

    1. 如何存储构成优先级队列(容器)的实际元素,以及
    2. 如何组织这些元素以有效地实现优先级队列(priority_queue 适配器类)。

    例如,vector 的标准实现在其容量远大于其实际大小时不需要缩小自身。这意味着如果您有一个由vector 支持的优先级队列,那么如果您将大量元素排入队列然后将它们全部出列,则最终可能会浪费内存,因为vector 将保留其旧容量。另一方面,如果您实现自己的 shrinking_vector 类,该类确实在需要时减少了其容量,您可以获得priority_queue 接口的所有好处,同时更有效地使用存储。

    另一个可能的例子 - 您可能想要更改正在使用的分配器,以便从特殊的资源池中分配优先级队列的元素。您可以通过使用自定义分配器将priority_queue 的容器类型设置为vector 来做到这一点。

    再想一想 - 假设您正在存储一个 priority_queue 的非常大的对象,这些对象的复制时间非常长。在这种情况下,vector 动态调整自身大小并复制其旧元素(或至少在 C++03 编译器中)这一事实可能是您不愿意支付的。因此,您可以切换到其他类型,可能是 deque,它会在调整大小时努力不复制元素,并且可以实现一些重大的性能提升。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      priority_queue 类是adapter pattern 的一个示例。它提供了一种在现有数据集上提供优先级队列服务的方法。作为适配器,它实际上需要一个底层容器。默认情况下,它指定vector。 (来自here)。

      就优势而言,它只是更灵活。 priority_queue 使用后备存储的以下方法,并要求它支持随机访问迭代器。

      • front
      • push_back
      • pop_back

      通过将其作为适配器提供,您可以通过提供不同的实现来控制性能特征。

      在 STL 中实现此功能的两个示例是 vector 和 deque。它们都具有不同的性能特征。例如,vector 通常在内存中是连续的,而deque 通常不是。向量中的push_back 操作仅是摊销的常数时间(它可能必须重新分配向量),而对于deque,它是在常数时间中指定的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多