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

时间:2013-05-06 14:22:37

标签: c++ stl

我已经定义了一个minheap如下

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

我使用定义的minheap如下

mergePartitionFilesQ_t mergeQ

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

答案:我觉得不需要仿函数所以我切换到函数指针,并根据flag选择了合适的函数。

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

谢谢freitass的帮助

2 个答案:

答案 0 :(得分:1)

您可以为您的仿函数定义一个接收比较函数的构造函数,并通过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;

编辑:假设您在施工时知道自己想要什么,就给出了答案。它不适合即时更改。

答案 1 :(得分:0)

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