C++ C++;复杂情况下的比较器传递参数问题
我有一个类A,其中有一个类B的成员变量。在B中,有一个优先级队列“q”的成员变量,我想为它定义一个定制的比较器类C。但是对于比较器,比较需要一个来自a的成员变量“f_val”。请注意,这些“f_val”是同一个对象,我将用一个共享指针替换它们,但我不打算在这里讨论 由于原始代码很长,基本思想如下:C++ C++;复杂情况下的比较器传递参数问题,c++,c++11,C++,C++11,我有一个类A,其中有一个类B的成员变量。在B中,有一个优先级队列“q”的成员变量,我想为它定义一个定制的比较器类C。但是对于比较器,比较需要一个来自a的成员变量“f_val”。请注意,这些“f_val”是同一个对象,我将用一个共享指针替换它们,但我不打算在这里讨论 由于原始代码很长,基本思想如下: class C { map<Point,double> f_val; C(double f_val1) { f_val=f_val1; } bool opera
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;
}
C类
{
地图f_val;
C(双f_val1)
{
f_val=f_val1;
}
布尔运算符()(常数点和pt1、常数点和pt2)
{
返回f_val[pt1]>f_val[pt2];
}
};
甲级
{
B B;
地图f_val;
}
B类
{
B(映射f_val1){f_val=f_val1;}
优先级队列q;
地图f_val;
}
我的问题是这不能被编译,因为f_val在传递到C()时不是静态的。那么如何解决这个问题呢?除了指定自定义比较类型之外,您还可以。以任何适合您需要的方式构造
C
对象(确保它是可复制构造的),然后将其传递给q
的构造函数
根据示例的状态(所有三个类都有一个
f_val
映射,并且没有指明哪一个是规范的),提供更具针对性的帮助有点困难。除了指定自定义比较类型之外,您还可以。以任何适合您需要的方式构造C
对象(确保它是可复制构造的),然后将其传递给q
的构造函数
鉴于您的示例的状态(所有三个类都有一个f_val
映射,并且没有指明哪一个是规范的),提供更具针对性的帮助有点困难。如果您看到,例如,您将看到您可以将comparator对象作为参数传递
因此,解决方案是使用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))
{}
};
结构B
{
地图&富瓦尔;
优先级队列q;
B(地图和f_val1)
:f_val(f_val1),q(C(f_val1))
{}
};
正如您在上面的示例中所看到的,我使用了对地图的引用。在类
C
中也使用映射的引用,以避免复制和映射不同步的风险。如果您看到,例如,您将看到可以将比较器对象作为参数传递
因此,解决方案是使用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))
{}
};
结构B
{
地图&富瓦尔;
优先级队列q;
B(地图和f_val1)
:f_val(f_val1),q(C(f_val1))
{}
};
正如您在上面的示例中所看到的,我使用了对地图的引用。在类
C
中使用地图参考,以避免复制和地图不同步的风险。更新了我的问题:“注意这些“f_val”是同一个对象,我将用共享指针替换它们,但我不打算在这里讨论。”更新了我的问题:“注意这些”f_val“是同一个对象,我将用共享指针替换它们,但我不打算在这里讨论。”