根据标志在最小堆和最大堆之间切换

Switch between min heap and max heap based on a flag

本文关键字:之间 标志      更新时间:2023-10-16

我定义了一个最小堆,如下所示

typedef priority_queue<megePartitions_t,vector<megePartitions_t>,compareMergePartition> mergePartitionFilesQ_t;

比较器定义如下

struct compareMergePartition
{
   bool operator()(const megePartitions_t &lhs,const megePartitions_t &rhs)
   {
      return *(lhs._pair) > *(rhs._pair);
   }
};

我使用定义的最小堆,如下所示

mergePartitionFilesQ_t mergeQ

现在,我想根据一个标志在minheap和maxheap之间切换,我是否应该改变比较器的构造函数来接受标志并使用它在大于或小于比较之间切换,或者有更好的方法。谢谢你的帮助。

答:我觉得不需要函数,所以我改用函数指针,并根据标志选择合适的函数

if(m_builtAcending)
    comparator = compareMergePartitionAsc;
else
    comparator = compareMergePartitionDes;
mergePartitionFilesQ_t mergeQ(comparator);

感谢freitass的帮助

您可以为接收比较函数的函函数定义一个构造函数,并通过std::lessstd::greater实例化它,如下所示:

template<class Comp>
struct compareMergePartition
{
   Comp comp;
   compareMergePartition(Comp comp) : comp(comp) {}
   bool operator()(const megePartitions_t &lhs,const megePartitions_t &rhs)
   {
      return comp(*(lhs._pair), *(rhs._pair));
   }
};
// Min heap
typedef priority_queue<megePartitions_t,vector<megePartitions_t>,compareMergePartition(std::less<megePartitions_t>())> mergePartitionFilesQ_t;
// Max heap
typedef priority_queue<megePartitions_t,vector<megePartitions_t>,compareMergePartition(std::greater<megePartitions_t>())> mergePartitionFilesQ_t;

编辑:这个答案是假设你在施工时知道你想要什么。不适合即时更改

一种方法是添加您提到的构造函数,但由于当您更改标志时,您的数据顺序将不正确;您将不得不重建整个优先级队列。也许你可以有两个队列,一个用于最小堆,一个用于最大堆?当标志的值改变时,将数据复制到另一个?(freitass提供的实现是一个很好的IMHO)