我有A类,其中有B类的成员变量。在B中,有priority_queue“ q”的成员变量,我想为其定义一个自定义的比较器类C。但是对于比较器而言,比较需要A中的成员变量“ f_val”。请注意,这些“ f_val”是同一对象,我将使用共享指针替换它们,但我不想在这里讨论。
由于原始代码很长,因此基本思想如下:
class C
{
map<Point,double> f_val;
C(double f_val1)
{
f_val=f_val1;
}
bool operator () (const Point &pt1, const Point &pt2)
{
return f_val[pt1] > f_val[pt2];
}
};
class A
{
B b;
map<Point,double> f_val;
}
class B
{
B(map<Point,double> f_val1){f_val=f_val1;}
priority_queue<Point,vector<Point>,C(f_val)> q;
map<Point,double> f_val;
}
我的问题是,由于f_val在传递给C()时不是静态的,因此无法编译。那我该如何解决呢?
答案 0 :(得分:2)
如果您看到例如this std::priority_queue
constructor reference,您会看到可以将比较器 object 作为参数传递。
因此解决方案是使用B
构造函数初始化器列表来构造和初始化队列:
struct B
{
map<Point, double>& f_val;
priority_queue<Point, dequeue<Point>, C> q;
B(map<Point, double>& f_val1)
: f_val(f_val1), q(C(f_val1))
{}
};
如您在上面的示例中看到的,我已经对地图使用了 reference 。还要在类C
中使用地图的引用,以避免复制和地图不同步的风险。
答案 1 :(得分:0)
除了指定自定义比较类型外,您还可以pass a custom comparator instance to the constructor of priority_queue
。满足您需要的任何方式构造一个C
对象(确保它是可复制构造的),然后将其传递给q
的构造函数。
鉴于您的示例状态(所有三个类都有一个f_val
映射,并且没有表明哪个是规范的),因此提供更具针对性的帮助有些困难。