我想使用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及其用法。我被困在这里一段时间,无法理解错误。任何帮助表示赞赏。
答案 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');