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

How to make a min heap of tuples sorted by the 2nd element?

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

// 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);
         }
     }
    

然后,您可以使用此比较器代替 greater>,如下所示:

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

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