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

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

本文关键字:第二个 元素 排序 何使 元组      更新时间:2024-09-21

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

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

但是,如果我的堆是一对int的元组,并且我想按第二个元素排序,该怎么办?

例如

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

您可以通过以下两种方式实现:

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

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

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

然后,您可以使用此比较器,而不是大于<元组<int,int>gt;例如:

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

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

您可以使用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