0

我已经定义了一个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 之间切换,我应该更改比较器的构造函数以接收标志并使用它在大于或小于比较之间切换还是有更好的方法。感谢您的帮助。

答:我觉得不需要函子,所以我切换到函数指针,并根据标志选择合适的函数。

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

谢谢你的帮助

4

2 回答 2

1

您可以为您的仿函数定义一个构造函数,该构造函数接收一个比较函数并通过std::lessor实例化它std::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;

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

于 2013-05-06T14:35:01.070 回答
0

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

于 2013-05-06T14:38:36.970 回答