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

标签 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() 时不是静态的。那么我该如何解决呢?

最佳答案

如果你看到例如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/

相关文章:

C++ FAQ Lite Smart_Ptr 类无法运行?

C++ promise / future : Which to return from a function?

c++ - 在大型应用程序的主体上使用 try catch

c++ - 将对象插入集合失败

c++ - 条件编译和模板

c++ - 未定义的函数引用 (c++)

c++ - 为什么我的函数给我 "Stack around the variable ' url' was corrupted."error?

c++ - 使用模板从类型列表中提升类型

c++ - 尽管传递了一个右值,为什么我的 move 构造函数没有被调用?

c++ - funsafe-math-optimizations,两行不同的公式,不同的结果