当前位置: 首页 > 知识库问答 >
问题:

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

干弘深
2023-03-14
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;
        }
};

priority_queue,comparator(query,d)>min_heap;

main.cpp:20:7:注意:“comparator”不是文字,因为:
class comparator{

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

Main.cpp:92:65:注意:应为类型,但得到“comparator(query,d)”

我不太精通const和constexpr及其用法。我在这里卡了一段时间,不能理解错误。感谢任何帮助。

共有1个答案

宓弘壮
2023-03-14

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

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

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

演示。

 类似资料:
  • 我使用的是PriorityQueue和我自己的比较器,但最终结果并不总是好的。我应该按平均成绩、姓名、身份证进行排序。最后,它应该返回队列中剩余的名称。其余的名字都很好,但顺序不同。输入(名称、平均等级、识别号): 预期产出: 我的结果: 你能帮我找出问题所在吗?提前谢谢你!

  • 假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?

  • 由于我对优先级队列的了解有限,所以我尝试实现它,但只能在asc或desc值xx中排序,这不是必需的。 我的方法是 请分享一些想法/方法。 看来很遗憾,我无法为我的情况提供所需的比较器。 不过,还是要在期待中感谢你

  • 我试图用自定义比较器定义优先级队列,如下所示: 这就是显示的编译错误 我还尝试在测试类中声明另一个比较函数,但没有效果。为什么主函数中的优先级队列编译而类中的优先级队列不编译?为比较器定义专用类是这里唯一的工作吗?谢谢你。

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。

  • 我不理解的是返回或的含义。如果返回,则哪个元素首先被推送到队列中,如果返回则是哪个元素?