c++ - std::sort 和 priority_queue (C++) 的比较顺序之间的区别
问题描述
我想知道为什么priority_queue
并vector
以完全不同的方式工作。这是示例:
priority_queue<int, vector<int>, less<int> > pq;
pq.push(1);
pq.push(2);
pq.push(3);
// if we print the elem in pq by pop(), we get 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>());
// but we get 1, 2, 3 for vector
两者都priority_queue
使用vector
过less
,但为什么结果不同?
解决方案
std::less
是 的默认比较器priority_queue
,并且std::vector
是默认容器,因此您的代码可以简化为:
priority_queue<int> pq;
根据文档,预计通过pop
优先级队列是一个容器适配器,它提供对最大(默认情况下)元素的恒定时间查找,代价是对数插入和提取。
实际上,我们得到一个max heap
withstd::less
作为比较器,这看起来不是很直观。要获得min heap
,我们需要将std::greater
其用作比较器。
推荐阅读
- angular - 从打字稿中的异步函数返回值
- javascript - 使用按钮 sweetalert2 php mysql ajax 删除行表
- typescript - 如何在 gRPC Web 中使用 async/await 模式?
- oauth-2.0 - 是否可以将 Micronaut OAuth2 回调 uri 设置为绝对 URL?
- python - 将环境迁移到新的 python 版本
- docker - 使用文件系统映射的 docker 卷(Windows)
- excel - Excel VBA 处理和粘贴许多形状现在在 Windows 10 中出错,但在 2016 年没有
- python - asyncio - 使用特定接口打开连接
- node.js - InvalidParameterValue:域在 aws lambda 中的 Request.extractError 处包含控件或空格
- c# - .Net Core 控制台应用程序日志记录功能 - 为什么我的 Console.WriteLine 出现在开始和结束日志记录之外?