对作为指针类型的priority_queue元素进行排序

时间:2012-08-06 22:04:22

标签: c++ stl

假设我们有一个priority_queue,它包含一堆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;

通过覆盖运算符&lt;方法或提供排序函子我们可以让priority_queue以val的升序保存ListNode对象。

我的问题是,如果priority_queue包含指向ListNode类的指针,而是我可以对指针进行排序,以便val的指向按升序排列。我该怎么做?

std::priority_queue<ListNode *> pq1;

谢谢!

2 个答案:

答案 0 :(得分:4)

正如您所说,std::priority_queue接受第三个模板参数作为比较函数,它必须用它来执行比较。

在比较之前,只需编写自己的解除引用项目:

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;

答案 1 :(得分:3)

指向ListNode的指针就像是日常指针。你不能在两个指针之间重载操作符。

但是,您可以为priority_queue覆盖比较运算符。它会是这样的:

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;

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