【发布时间】:2014-05-19 06:10:47
【问题描述】:
我正在编写一个具有三个优先级队列作为私有成员的类。
class Foo {
...
...
private:
// I am fine with using pointers instead if it helps.
std::priority_queue<int> first; // min heap.
std::priority_queue<int> second; // max heap.
std::priority_queue<int> third; // min heap.
};
现在我要求first 和third 以min heaps 和second 开头为max heap。作为课堂功能的一部分,我需要执行以下操作:
- 将
second移动到first。理想情况下,这是通过最少的复制量来实现的。底层向量应该被移动。此外,first现在应该表现得像max heap。 - 将
third移动到second。这意味着second现在应该表现得像min heap。 - 由于
third的内容已经移动到second,它应该是空的。我想分配一个新的底层向量或重新使用first's底层向量(它不再需要它了。另外第三个现在应该是max heap。
我需要执行这个循环(最大值 -> 最小值和最小值 -> 最大值)未知次数。
我很难用std::priority_queue 做到这一点,因为比较器是一个模板参数,这意味着我无法在运行时更改它。这使我无法将 min heap 变成 max heap。
所以我的问题是:
- 有没有一种方法可以让
std::priority_queue进行我的竞标而不让它变得非常丑陋? - 如果不是,那么我是否可以重新组织我的班级来做同样的事情,但仍然使用
std::priority_queue? - 否则我是否可以重用 std 库中的大部分
heapify逻辑来实现此目的?
【问题讨论】:
-
有趣且写得很好的问题,+1,我们需要更多这样的问题。
-
得走了,所以没有时间给出完整的答案,但是:如您所见,最大和最小 PQ 是不同的类型,因此您需要这样声明它们,不能只是重新分配。也许实际上有两个最大和两个最小堆。保留州旗以了解您在特定时间拥有的州旗。您需要为所有 PQ 提供一个通用接口,因此您需要为每个 PQ 编写一个适配器。
标签: c++ c++11 priority-queue