实现此自定义priority_queue的正确方法是什么

时间:2019-08-17 14:21:42

标签: c++ priority-queue

我想建立一个对象的优先级队列,该对象具有三个具有自己的比较器的元素。我尝试了以下代码,但显示错误。


#include<bits/stdc++.h>
using namespace std;


class triplet {
    public:    
        int data;
        int arr;
        int index;       
};

bool compare( triplet x, triplet y ){

    if(x.data < y.data){
        return true;
    }
    else{
        return false;
    }
}

int main(){

 priority_queue<triplet,vector<triplet>,compare> pq1;

}

出现以下错误 enter image description here

1 个答案:

答案 0 :(得分:2)

如果两个元素相等,则比较例程必须返回false,但是您的版本必须返回true。

试试看

bool compare(triplet x, triplet y) {

    if (x.data < y.data) {
        return true;
    }
    else {
        return false;
    }
}

或使其变得更简单

bool compare(triplet x, triplet y) {    
    return x.data < y.data;
}

但是重要的是<而不是<=

编辑

您的代码还错误地使用了comparecompare不是类型,因此它不是priority_queue模板的有效参数。

compare的类型为bool (*)(triplet, triplet),因此正确的方法是在模板中使用该类型并将实际的比较函数传递给构造函数。像这样

priority_queue<triplet, vector<triplet>, bool (*)(triplet, triplet)> pq1(compare);

顺便说一句,通常您可以通过创建比较 functor 而不是函数来实现。这样可以更清洁(并且可能更高效)。