如何使元组的最小堆按第二个元素排序?

问题描述

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

// 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::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
,

您可以通过两种方式执行此操作:

  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,vector<tuple<int,Comparator> pq;

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