设置priority_queue容器的优点

时间:2012-03-31 17:43:22

标签: c++ stl priority-queue

使用stl priority_queue,您可以设置基础容器,例如vector。为stl priority_queue

指定容器有哪些优点?

2 个答案:

答案 0 :(得分:14)

设置基础容器可以将两个逻辑上独立的问题分开:

  1. 如何存储构成优先级队列(容器)的实际元素,以及
  2. 如何组织这些元素以有效地实现优先级队列(priority_queue适配器类)。
  3. 作为一个例子,vector的标准实现不需要在其容量远大于其实际大小时缩小自身。这意味着如果您有一个由vector支持的优先级队列,如果您将大量元素排入队列然后将所有元素出列,那么最终可能会浪费内存,因为vector将保留其旧容量。另一方面,如果您实现自己的shrinking_vector类,在需要时实际上会降低其容量,则可以在更有效地使用存储的同时获得priority_queue接口的所有好处。 / p>

    另一个可能的示例 - 您可能希望更改正在使用的分配器,以便从特殊资源池分配优先级队列的元素。您可以通过使用自定义分配器将priority_queue的容器类型设置为vector来实现此目的。

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

    希望这有帮助!

答案 1 :(得分:2)

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

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

  • front
  • push_back
  • pop_back

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

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