作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了一个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::less
或 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;
编辑:假设您在施工时就知道自己想要什么,就给出了这个答案。它不适合即时更改。
关于c++ - 根据标志在最小堆和最大堆之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400792/
我是一名优秀的程序员,十分优秀!