C++ priority_queue比较规则疑问及sort与优先级队列比较器合并问询
Q1 解答
你没有遗漏堆实现的相关知识点,这里的歧义来自于描述里的「排序在前」特指使用同一Compare规则作为std::sort的比较函数时,排序后位于数组靠前位置的元素。
举个最简单的例子:默认的std::less
priority_queue的比较规则语义和sort正好相反:比较规则返回true时,代表第一个参数的优先级低于第二个参数,要放在堆的下层,所以堆顶永远是优先级最高的元素,和sort的升序/降序逻辑是反的,你之前掌握的堆索引计算逻辑完全正确。
Q2 解答
你可以通过静态成员函数的方式把两个比较逻辑放到同一个struct里,不会出现重载冲突,因为静态成员函数没有隐含的this指针,和非静态的operator()签名不重复,参考实现如下:
struct Compare { // 给sort用的比较逻辑:按第0位升序 static bool sortCmp(const vector<int>& l, const vector<int>& r) { return l[0] < r[0]; } // 给priority_queue用的比较逻辑:按第1位实现小顶堆 bool operator()(const vector<int>& l, const vector<int>& r) const { return r[1] < l[1]; } }; int solution(vector<vector<int>> jobs) { sort(jobs.begin(), jobs.end(), Compare::sortCmp); priority_queue<vector<int>, vector<vector<int>>, Compare> jobQueue; // 后续业务逻辑 }
这里额外把参数改成了const引用、operator()加了const修饰,符合C++ const正确性规范,避免比较过程中意外修改元素。
内容的提问来源于stack exchange,提问作者신승빈
相关产品推荐
相关产品推荐

