我有一个类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() 时不是静态的。那么我该如何解决呢?
最佳答案
如果你看到例如this std::priority_queue
constructor reference你会看到你可以传递一个比较器对象作为参数。
因此解决方案是使用您的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))
{}
};
如您在上面的示例中所见,我使用了 map 的引用。在类 C
中也使用 map 的引用,以避免复制和 map 不同步的风险。
关于C++比较器复杂情况传参问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52547914/