使用stl priority_queue
,您可以设置基础容器,例如vector
。为stl priority_queue
?
答案 0 :(得分:14)
设置基础容器可以将两个逻辑上独立的问题分开:
priority_queue
适配器类)。作为一个例子,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中实现此功能的两个示例是vector
和deque
。这两者都具有不同的性能特征。例如,vector
通常在内存中是连续的,而deque
通常不是。push_back
。向量中的deque
操作仅分摊常量时间(可能必须重新分配向量),而对于{{1}},它在常量时间内指定。