C ++比较器传递复杂情况的参数问题

时间:2018-09-28 03:36:10

标签: c++ c++11

我有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()时不是静态的,因此无法编译。那我该如何解决呢?

2 个答案:

答案 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映射,并且没有表明哪个是规范的),因此提供更具针对性的帮助有些困难。