gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:37:46 24 4
gpt4 key购买 nike

我定义了一个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);
}
};

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

mergePartitionFilesQ_t mergeQ

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

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

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

谢谢你的帮助

最佳答案

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

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

关于c++ - 根据标志在最小堆和最大堆之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com