C++复杂情况的比较器通过参数问题

C++ comparator passing argument problem of complex situation

本文关键字:参数 问题 比较器 复杂 情况 C++      更新时间:2023-10-16

我有类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;
}

我的问题是这无法编译,因为传递给 C(( 时f_val不是静态的。那么我该如何解决这个问题呢?

例如,如果您看到这个std::priority_queue构造函数引用,您将看到您可以将比较器对象作为参数传递。

因此,解决方案是使用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))
{}
};

正如您在上面的示例中所看到的,我使用了对地图的引用。还要在类C中使用地图的引用,以避免复制和映射不同步的风险。

除了指定自定义比较类型外,还可以将自定义比较器实例传递给priority_queue的构造函数。以任何符合您需求的方式构造一个C对象(确保它是可复制构造的(,然后将其传递给q的构造函数。

鉴于示例的状态(所有三个类都有一个f_val映射,并且没有指示哪个类是规范的(,提供更有针对性的帮助有点困难。