C++中std::sort与priority_queue的比较器排序顺序差异问题
C++ priority_queue与std::sort同用less排序结果不同的原因
先附上测试代码:
priority_queue<int, vector<int>, less<int> > pq; pq.push(1); pq.push(2); pq.push(3); // 若依次调用pop()输出元素,得到顺序为3, 2, 1 vector<int> v; v.push_back(1); v.push_back(3); v.push_back(2); std::sort(v.begin(), v.end(), less<int>()); // 排序后vector的元素顺序为1, 2, 3
二者结果差异的核心原因是对比较器的语义定义完全不同:
std::sort的比较器规则:当比较器comp(a, b)返回true时,代表排序逻辑中a应该排在b的前面。使用less<int>()时,仅当a < b时返回true,因此更小的元素会被放在序列前面,最终得到升序排列的结果。priority_queue的比较器规则:当比较器comp(a, b)返回true时,代表a的优先级低于b,b会被放在更靠近堆顶的位置。使用less<int>()时,仅当a < b时返回true,说明数值更大的元素优先级更高,堆顶始终存放当前最大的元素,依次pop()就会得到降序排列的结果。
如果需要priority_queue的弹出顺序和std::sort升序结果一致,将比较器替换为greater<int>即可,此时数值更小的元素优先级更高,弹出顺序为1、2、3。
内容的提问来源于stack exchange,提问作者J. Victor
相关产品推荐
相关产品推荐

