1. 优先队列基础概念与使用场景
优先队列(Priority Queue)是C++标准库中一个极为实用的容器适配器,它基于堆数据结构实现,能够自动对元素进行排序管理。与普通队列的先进先出(FIFO)特性不同,优先队列遵循"优先级最高者先出"的原则,这使得它在许多算法和系统设计中大显身手。
在游戏开发中,我们常用优先队列处理事件系统。比如一个MMORPG游戏中,当多个技能同时触发时,优先级高的技能(如治疗技能)需要优先处理。又如在操作系统的进程调度中,高优先级的任务应当优先获得CPU资源。这些场景下,优先队列都是最佳选择。
标准库中的priority_queue定义在
cpp复制template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type>>
class priority_queue;
三个模板参数分别表示:
- T:存储的元素类型
- Container:底层容器类型(默认为vector)
- Compare:比较函数对象类型(默认为less,即大顶堆)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 优先队列的核心操作与性能分析
2.1 基本操作接口解析
优先队列提供了一套简洁但功能完备的接口:
cpp复制// 构造一个空优先队列
priority_queue<int> pq;
// 使用迭代器范围构造
vector<int> vec{3,1,4,1,5};
priority_queue<int> pq(vec.begin(), vec.end());
// 插入元素(时间复杂度O(log n))
pq.push(9);
// 访问顶部元素(时间复杂度O(1))
int top = pq.top();
// 弹出顶部元素(时间复杂度O(log n))
pq.pop();
// 查询队列大小
size_t size = pq.size();
// 判断是否为空
bool isEmpty = pq.empty();
2.2 底层实现原理
优先队列通常基于二叉堆实现,这是一种完全二叉树,满足:
- 大顶堆:每个节点的值都大于等于其子节点
- 小顶堆:每个节点的值都小于等于其子节点
堆的插入操作(push)采用"上浮"策略:
- 将新元素放入底层容器末尾
- 与父节点比较,若优先级更高则交换
- 重复步骤2直至满足堆性质
堆的删除操作(pop)采用"下沉"策略:
- 将堆顶元素与末尾元素交换
- 删除末尾元素(原堆顶)
- 新堆顶元素与其子节点比较,与优先级更高的子节点交换
- 重复步骤3直至满足堆性质
2.3 时间复杂度对比
| 操作 | 时间复杂度 | 说明 |
|------------|-----
