这不是一个重复的问题它在这里有所不同,因为比较函数对主类具有依赖性。
我所有的逻辑都在课堂上。我有一张地图nodeCnt
,可以查看getCnt()
。我正在弄清楚如何为我的优先级队列myCmp
进行自定义比较pq
,它将根据地图进行比较。
以下代码段不起作用。并且reference docs中描述的auto cmp
无法完成,因为Class不能为比较函数提供此类声明。
Class AllLogic {
private:
std::map<int, int> nodeCnt;
// This is my confusing part
std::priority_queue<int, std::vector<int>, decltype(&myCmp)> pq(&myCmp);
public:
int getCnt(int val) {
if (nodeCnt.find(val) != nodeCnt.end())
return nodeCnt[val];
return 0;
}
bool myCmp(int left, int right) {
return getCnt(left) < getCnt(right);
}
};
答案 0 :(得分:3)
制作这样的结构:
// forward declare your class, because the comparator will use it
class AllLogic;
struct MyCompareT
{
AllLogic* object;
bool operator()(int left, int right) const;
};
// after AllLogic has been defined
bool MyCompareT::operator()(int left, int right) const {
return object->myCmp(left, right);
}
您的priority_queue
可以定义为:
std::priority_queue<int, std::vector<int>, MyCompareT> pq;
并在构造函数中初始化如下:
AllLogic() :pq(MyCompareT{this}) {}
答案 1 :(得分:1)
您可以将代码重新编写一下(注意:以下是c ++ 11):
#include <map>
#include <queue>
比较仿函数接受地图的引用,并用它来比较:
struct myCmp {
explicit myCmp(std::map<int, int> &nodeCnt) : nodeCnt_{&nodeCnt} {}
bool operator()(int lhs, int rhs) const {
auto lhs_it = nodeCnt_->find(lhs);
auto rhs_it = nodeCnt_->find(rhs);
auto lhs_val = lhs_it == nodeCnt_->end()? 0: lhs_it->second;
auto rhs_val = rhs_it == nodeCnt_->end()? 0: rhs_it->second;
return lhs_val < rhs_val;
}
private:
std::map<int, int> *nodeCnt_;
};
该类设置地图,然后是比较仿函数,然后是队列;每一个都使用前一个:
class AllLogic {
private:
std::map<int, int> nodeCnt;
myCmp myCmp_{nodeCnt};
std::priority_queue<int, std::vector<int>, myCmp> pq{myCmp_};
};
int main(){}