C++ 指针类型的优先级队列元素的排序

C++ 指针类型的优先级队列元素的排序,c++,stl,C++,Stl,假设我们有一个优先级队列,该队列包含一组声明如下的ListNode对象: class ListNode { int val; ListNode *next; public: explicit ListNode(int v) : val(v), next(NULL) {} inline bool operator<(const ListNode& rhs) const { return val < rhs.val; } }; std::priori

假设我们有一个优先级队列,该队列包含一组声明如下的ListNode对象:

class ListNode {
  int val;
  ListNode *next;
public:
  explicit ListNode(int v) : val(v), next(NULL) {}
  inline bool operator<(const ListNode& rhs) const {
    return val < rhs.val;
  }
};

std::priority_queue<ListNode> pq;
类列表节点{
int-val;
ListNode*下一步;
公众:
显式ListNode(intv):val(v),next(NULL){}
内联布尔运算符如您所说,接受一个比较函子作为第三个模板参数,它必须使用该函子来执行比较

只需编写自己的代码,在比较项目之前取消引用这些项目:

template<typename T>
struct PtrLess
{
    bool operator()(const T* left, const T* right)
    {
        return *left < *right;
    }
};


std::priority_queue<ListNode *, std::vector< ListNode * >, PtrLess< ListNode > > pq1;
模板
无结构
{
布尔运算符()(常数T*左,常数T*右)
{
返回*左<*右;
}
};
std::priority_队列,PtrLess>pq1;

指向
列表节点的指针类似于日常指针。不能在两个指针之间重载运算符

但是,您可以为
优先级\u队列
的目的覆盖比较运算符

struct ListNodePtrLess {
    bool operator()(const ListNode* a, const ListNode* b) {
        return a->val < b->val;
    }
};

typedef std::priority_queue<ListNode*, std::vector<ListNode*>, ListNodePtrLess> MyPriorityQueue;
struct ListNodePtrLess{
布尔运算符()(常量ListNode*a,常量ListNode*b){
返回a->valval;
}
};
typedef std::priority_队列MyPriorityQueue;

(另外:您需要使
ListNodePtrLess
成为
ListNode
的朋友,或者让它以不同的方式访问
val
字段)

Agh…你刚才是一瞬间:)@CygnusX1:总是发生:)+1你的答案也是。@MatteoItalia:如果使用比较函数,第二个参数std::vector是可选的吗?@itnovel:很遗憾,如果你想指定自定义的第三个参数,你就不能使用第二个参数的默认值(参见示例).试试。@KerrekSB,:ptr_compare functor也能满足我的需要。谢谢!@CygnuxS1:谢谢你的回答。
struct ListNodePtrLess {
    bool operator()(const ListNode* a, const ListNode* b) {
        return a->val < b->val;
    }
};

typedef std::priority_queue<ListNode*, std::vector<ListNode*>, ListNodePtrLess> MyPriorityQueue;