【问题标题】:Create priority_queue with pair such that sorting is "<" for first element and ">" for second element when 1st elements are equal使用pair创建priority_queue,这样当第一个元素相等时,第一个元素的排序为“<”,第二个元素的排序为“>”
【发布时间】:2017-10-14 23:23:41
【问题描述】:

我有一个基本的疑问,因为我试图弄清楚 C++ 中 priority_queue STL 的多功能性。

我知道默认情况下优先级队列实际上是一个max_heap。我也知道可以通过以下方式修改它以创建 min_heap:

priority_queue &lt;int, vector&lt;int&gt;, greater&lt;int&gt; &gt; pq;

我的目标是,我想创建一个priority_queue &lt;pair &lt;int,int&gt; 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


【解决方案1】:

您可以编写自定义比较,将第一个元素与operator&lt; 进行比较,将第二个元素与operator&gt; 进行比较。

struct less_then_greater {
    template<typename T, typename U>
    bool operator()(T const& lhs, U const& rhs) const {
        if (lhs.first < rhs.first) return true;
        if (rhs.first < lhs.first) return false;
        return lhs.second > lhs.second;
    }
};

std::priority_queue<std::pair<int, int>,
                    std::vector<std::pair<int, int>>,
                    less_then_greater
                   > pq;

请注意,这并不是为一个创建最小堆,而为另一个创建最大堆。但根据您描述的输出,我认为这不是您真正要求的。

【讨论】:

  • 我同意一个的最小堆和另一个的最大堆不是最准确的放置方式,但是这样做了。
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 2022-01-07
  • 1970-01-01
  • 2023-03-18
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多