【问题标题】:How to make a min heap of tuples sorted by the 2nd element?如何制作按第二个元素排序的最小元组堆?
【发布时间】:2020-11-11 15:04:19
【问题描述】:

所以我可以通过执行以下操作来创建最小堆:

// Creates a min heap
priority_queue <int, vector<int>, greater<int> > pq;
pq.push(5);
pq.push(1);
pq.push(10);
pq.push(30);
pq.push(20);

// One by one extract items from min heap
while (pq.empty() == false)
{
    cout << pq.top() << " ";
    pq.pop();
}

return 0;

但是如果我的堆是一对整数的元组并且我想按第二个元素排序呢?

例如

priority_queue<tuple<int,int>, vector<tuple<int,int>>> pq;
pq.push(make_tuple(3,2));
pq.push(make_tuple(4,9));
pq.push(make_tuple(1,5));

【问题讨论】:

  • std::priority_queue上使用lambda的例子
  • 比较器是std::priority_queue的模板参数

标签: c++ priority-queue min-heap


【解决方案1】:

您可以使用 std::get 按第二个元素进行比较:

int main()
{
    auto cmp = [](const std::tuple<int,int>& left, const std::tuple<int,int>& right)
        {
            return std::get<1>(left) > std::get<1>(right);
        };
    std::priority_queue<std::tuple<int,int>, std::vector<std::tuple<int,int>>, decltype(cmp)> pq(cmp);
    pq.push(std::make_tuple(3,2));
    pq.push(std::make_tuple(4,9));
    pq.push(std::make_tuple(1,5));
    while (pq.empty() == false)
    {
        std::cout << std::get<1>(pq.top()) << std::endl;
        pq.pop();
    }
    return 0;
}

预期输出:

2
5
9

【讨论】:

    【解决方案2】:

    您可以通过两种方式做到这一点:

    1. 更改元组的顺序,使要排序的列是元组中的第一个。

    2. 在您的函数定义之外创建一个自定义比较器。

       Struct Comparator {
          bool operator()(tuple<int, int>& t1, tuple<int, int>& t2) {
               return std::get<1>(t1) > std::get<1>(t2);
           }
       }
      

    然后,你可以使用这个比较器来代替更大的>:

        priority_queue<tuple<int, int>, vector<tuple<int, int>>, Comparator> pq;
    

    当您处理复杂的对象并希望按特定属性排序时,这非常方便。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 2022-08-18
      • 2012-03-08
      • 2012-05-18
      • 2012-03-13
      • 2015-06-16
      • 2019-04-11
      • 2021-12-08
      相关资源
      最近更新 更多