C++ 优先级队列的自定义比较器

C++ 优先级队列的自定义比较器,c++,priority-queue,C++,Priority Queue,我想用KD树实现K近邻搜索 为了保持最近点,我构造了一个优先级队列,其中每个元素的类型都是double*(指向数组的指针)。我有一个自定义比较器类,我向它传递了两个参数,double*query和int d(维度): 优先级队列最小堆; 我的comparator类如下所示: class comparator{ double* query; int d; public: int operator()( double* point1, double* po

我想用KD树实现K近邻搜索

为了保持最近点,我构造了一个优先级队列,其中每个元素的类型都是double*(指向数组的指针)。我有一个自定义比较器类,我向它传递了两个参数,double*query和int d(维度):

优先级队列最小堆;
我的comparator类如下所示:

class comparator{
    double* query;
    int d;
    public:
        int operator()( double* point1,  double* point2) {
            double dist1 = 0,dist2 = 0;
            for(int i=0;i<d;i++){
                dist1 += (point1[i] - query[i]) * (point1[i] - query[i]);
                dist2 += (point2[i] - query[i]) * (point2[i] - query[i]);
            }
            return dist1 < dist2;
        }

        comparator(double * query,int d)
        {
            this->query = query;
            this->d = d;
        }
};
comparator pq_cmp(query, d);
priority_queue <double* , vector<double*>, decltype(pq_cmp) > min_heap(pq_cmp);
类比较器{
双*查询;
int d;
公众:
int运算符()(双*点1,双*点2){
双区1=0,区2=0;
for(inti=0;iquery=query;
这个->d=d;
}
};
我得到以下错误:

main.cpp:92:63:错误:常量表达式中非文字类型“comparator”的临时

优先级队列,比较器(查询,d)>最小堆

main.cpp:20:7:注意:'comparator'不是文字,因为:
类比较器{

main.cpp:20:7:注意:“comparator”不是聚合,没有一个普通的默认构造函数,也没有不是复制或移动构造函数的constexpr构造函数

main.cpp:92:65:错误:“模板类std::priority\u队列”的模板参数列表中参数3处的类型/值不匹配

优先级队列,比较器(查询,d)>最小堆

main.cpp:92:65:注意:应该是一个类型,得到“comparator(query,d)”的值


我不太熟悉const和constexpr及其用法。我在这里停留了一段时间,无法理解错误。非常感谢您的帮助。

您正在尝试将对象传递给模板参数;但是,模板参数必须是类型,因此第三个参数必须是比较器的类型

对于comparator对象,需要将其传递给优先级队列的构造函数,如下所示:

class comparator{
    double* query;
    int d;
    public:
        int operator()( double* point1,  double* point2) {
            double dist1 = 0,dist2 = 0;
            for(int i=0;i<d;i++){
                dist1 += (point1[i] - query[i]) * (point1[i] - query[i]);
                dist2 += (point2[i] - query[i]) * (point2[i] - query[i]);
            }
            return dist1 < dist2;
        }

        comparator(double * query,int d)
        {
            this->query = query;
            this->d = d;
        }
};
comparator pq_cmp(query, d);
priority_queue <double* , vector<double*>, decltype(pq_cmp) > min_heap(pq_cmp);
比较器pq\U cmp(查询,d); 优先级队列最小堆(pq\U cmp);