如何使元组的最小堆按第二个元素排序
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;
但是,如果我的堆是一对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));
您可以通过以下两种方式实现:
-
更改元组的顺序,使要排序的列成为元组中的第一列。
-
在函数定义之外创建一个自定义比较器。
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
相关文章:
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 打印无序映射的第二个元素,即集合
- c++:交换向量中所有元组的第一个和第二个元素
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- 为什么我在对向量的第二个元素"push_back"中有C3867错误
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- 如何获得相同数量的第一个和第二个元素以及它们在c++中各自的位置
- 使用索引与迭代器将向量迭代到倒数第二个元素
- C++ 比较容器中所有对的第一个和第二个元素
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 如何仅根据第二个元素对map<int,pair<int,int> >进行排序?
- 如何通过STL设置迭代直到第二个元素
- 如何获取列表中的倒数第二个元素
- 如何在C 对向量的第二个元素上执行较低的操作
- 如何迭代双重链接列表的每个第二个元素(戒指)
- C++迭代到倒数第二个元素
- 迭代对向量并访问第一个和第二个元素
- 为什么在地图中打印第二个元素