优先队列的自定义比较器

时间:2018-03-30 14:11:02

标签: c++ priority-queue

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

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

priority_queue <double* , vector<double*>, comparator(query,d) > min_heap;

我的比较器类看起来像这样:

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;
        }
};

我收到以下错误:

  

main.cpp:92:63:错误:在常量表达式中非临时的非文字类型'比较器'

     
    

priority_queue,比较器(查询,d)&gt; min_heap;

  
     

main.cpp:20:7:注意:“比较器”不是字面值,因为:
  类比较器{

     

main.cpp:20:7:注意:“比较器”不是聚合,没有普通的默认构造函数,并且没有constexpr构造函数,它不是复制或移动构造函数

     

main.cpp:92:65:错误:模板参数列表中参数3的类型/值不匹配'template class std :: priority_queue'

     
    

priority_queue,比较器(查询,d)&gt; min_heap;

  
     

main.cpp:92:65:注意:期待一个类型,得到'比较器(查询,d)'

我不熟悉const和constexpr及其用法。我被困在这里一段时间,无法理解错误。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

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

对于比较器对象,需要将其传递给priority_queue的构造函数,如下所示:

var getDaysLeft = function (date) {
  var today = new Date();
  var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
  var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);   
  return daysLeft;
};

getDaysLeft('YYYY-MM-DD');

Demo.