【发布时间】:2012-03-31 17:43:21
【问题描述】:
使用 stl priority_queue 可以设置底层容器,例如 vector。为 stl priority_queue 指定容器有哪些好处?
【问题讨论】:
标签: c++ stl priority-queue
使用 stl priority_queue 可以设置底层容器,例如 vector。为 stl priority_queue 指定容器有哪些好处?
【问题讨论】:
标签: c++ stl priority-queue
设置底层容器可以分离出两个逻辑上独立的关注点:
priority_queue 适配器类)。例如,vector 的标准实现在其容量远大于其实际大小时不需要缩小自身。这意味着如果您有一个由vector 支持的优先级队列,那么如果您将大量元素排入队列然后将它们全部出列,则最终可能会浪费内存,因为vector 将保留其旧容量。另一方面,如果您实现自己的 shrinking_vector 类,该类确实在需要时减少了其容量,您可以获得priority_queue 接口的所有好处,同时更有效地使用存储。
另一个可能的例子 - 您可能想要更改正在使用的分配器,以便从特殊的资源池中分配优先级队列的元素。您可以通过使用自定义分配器将priority_queue 的容器类型设置为vector 来做到这一点。
再想一想 - 假设您正在存储一个 priority_queue 的非常大的对象,这些对象的复制时间非常长。在这种情况下,vector 动态调整自身大小并复制其旧元素(或至少在 C++03 编译器中)这一事实可能是您不愿意支付的。因此,您可以切换到其他类型,可能是 deque,它会在调整大小时努力不复制元素,并且可以实现一些重大的性能提升。
希望这会有所帮助!
【讨论】:
priority_queue 类是adapter pattern 的一个示例。它提供了一种在现有数据集上提供优先级队列服务的方法。作为适配器,它实际上需要一个底层容器。默认情况下,它指定vector。 (来自here)。
就优势而言,它只是更灵活。 priority_queue 使用后备存储的以下方法,并要求它支持随机访问迭代器。
frontpush_backpop_back通过将其作为适配器提供,您可以通过提供不同的实现来控制性能特征。
在 STL 中实现此功能的两个示例是 vector 和 deque。它们都具有不同的性能特征。例如,vector 通常在内存中是连续的,而deque 通常不是。向量中的push_back 操作仅是摊销的常数时间(它可能必须重新分配向量),而对于deque,它是在常数时间中指定的。
【讨论】: