假设我们有一个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;
谢谢!
答案 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
字段)