根据标志在最小堆和最大堆之间切换
Switch between min heap and max heap based on a flag
我定义了一个最小堆,如下所示
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::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;
编辑:这个答案是假设你在施工时知道你想要什么。不适合即时更改
一种方法是添加您提到的构造函数,但由于当您更改标志时,您的数据顺序将不正确;您将不得不重建整个优先级队列。也许你可以有两个队列,一个用于最小堆,一个用于最大堆?当标志的值改变时,将数据复制到另一个?(freitass提供的实现是一个很好的IMHO)
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- Atom 和 i3/5 之间的通用 gcc C/C++ 标志?
- 两个成员都是位标志的大小相同的类之间的实际差异
- 线程之间的更改通知标志需要内存屏障吗
- 根据标志在最小堆和最大堆之间切换
- 标准的原子布尔值和原子标志之间的区别
- 如何最好地防止库(源)和应用程序(头)编译之间的(编译器)标志不匹配