【发布时间】:2017-10-14 23:23:41
【问题描述】:
我有一个基本的疑问,因为我试图弄清楚 C++ 中 priority_queue STL 的多功能性。
我知道默认情况下优先级队列实际上是一个max_heap。我也知道可以通过以下方式修改它以创建 min_heap:
priority_queue <int, vector<int>, greater<int> > pq;
我的目标是,我想创建一个priority_queue <pair <int,int> pq,这样堆是对中第一个元素的 max_heap,它是对中第二个元素的 min_heap。例如,在插入以下对时:
(2,4) (1,5) (1,6)
元素显示时的输出如下:
(2,4)
(1,5)
(1,6)
默认情况下,输出应该是:
(2,4)
(1,6)
(1,5)
有可能吗?如果是,那么如何?
提前谢谢你。
【问题讨论】:
-
我建议您将 minheap 和 maxheap 分开,并且仅使用您的“pair”约定作为显示工件。
-
@KennyOstrom 我怀疑实际上并没有两个堆,而是一个具有辅助排序属性的堆,当第一个排序属性存在关联时,它适用。问题的措辞不清楚。
-
那……不可能吧?如果第一个元素形成一个最大堆,那么如果它们实际上是配对的,那么第二个元素将不会形成一个最小堆,除非纯粹靠运气。做 (1,1) (2,2) (3,3)
-
@KennyOstrom:是的,不可能为第一个元素形成一个最大堆,同时为第二个元素形成一个最小堆。根据他想要的输出,我认为他并没有要求这样做。他基本上要求基于第一个元素的最大堆。但是在第一个元素相等的情况下,顺序由第二个元素决定,但与第一个元素决定顺序的方式相反。
-
那么基本上“你如何编写自定义比较器”。凉爽的。是的,c++ 并不限制你只能使用 std::greater 和 std::lesser。或者,如果您在相关类型上定义 operator ,您也可以使用它们。
标签: c++ priority-queue std-pair