C++标准模板库中的优先队列
C++优先队列 是一种容器适配器,特别设计成队列的第一个元素是队列中所有元素中最大的还是最小的元素,并且元素是非递减或非递增的顺序(因此我们可以看到队列的每个元素都有一个优先级{固定顺序})。
在C++的STL中,默认情况下,队列的顶端元素总是最大的。我们还可以将其更改为顶端的最小元素。优先队列是建立在最大堆的基础之上,并使用数组或向量作为内部结构。简单来说, STL优先队列 是堆数据结构的实现。
语法:
例子:
输出:
最大堆优先队列(默认方案)
如何为优先队列创建最小堆?
正如我们之前看到的,C++中的优先队列默认实现为最大堆,但是,它还提供了另一个参数来将其更改为最小堆,方法是在创建优先队列时传递另一个参数。
语法:
例子:
输出:
最小堆优先队列
注意: 上述语法可能难以记忆,因此在数字值的情况下,我们可以将值乘以-1并使用max heap获取min heap的效果。不仅如此,我们还可以通过替换 大于(greater) 与自定义比较函数来使用自定义排序方法。
优先队列的方法
下面是std::priority_queue类的所有方法的列表:
方法 | 定义 |
---|---|
priority_queue::empty() | 返回队列是否为空。 |
priority_queue::size() | 返回队列的大小。 |
priority_queue::top() | 返回队列中优先级最高的元素的引用。 |
priority_queue::push() | 将元素‘g’添加到队列的末尾。 |
priority_queue::pop() | 删除队列的第一个元素。 |
priority_queue::swap() | 用于交换两个队列的内容,但这两个队列必须是相同类型的,尽管大小可能不同。 |
priority_queue::emplace() | 用于向优先队列容器中插入新元素。 |
priority_queue value_type | 表示作为优先队列中元素存储的对象类型。它是模板参数的代名词。 |
C++中的优先队列操作
1. 插入和删除优先队列元素
使用 push() 方法插入元素到优先队列中,使用 pop() 方法删除具有最高优先级的元素。
下面是C++程序的各种优先队列函数:
输出
注 :上述是一种优先队列初始化方法。
2. 访问优先队列的顶部元素
可以使用 _top() _ 方法访问优先队列的顶部元素。
输出
输出
5. 将新元素插入优先队列容器
emplace() 函数用于将新元素插入优先队列容器中,新元素根据其优先级添加到优先队列中。它类似于push操作。不同之处在于,emplace()操作避免了对象的不必要复制。
下面是在C++中将新元素插入优先队列容器的示例程序:
输出
6. 表示存储在优先队列元素中的对象类型
priority_queue :: value_type方法是C++ STL中的一个内置函数,用于表示存储为优先队列元素的对象类型。它作为模板参数的同义词。
语法:
下面是在C++中表示存储在优先队列元素中的对象类型的示例程序:
输出
所有操作的复杂度:
方法 | 时间复杂度 | 辅助空间 |
---|---|---|
priority_queue::empty() | O(1) | O(1) |
priority_queue::size() | O(1) | O(1) |
priority_queue::top() | O(1) | O(1) |
priority_queue::push() | O(logN) | O(1) |
priority_queue::pop() | O(logN) | O(1) |
priority_queue::swap() | O(1) | O(N) |
priority_queue::emplace() | O(logN) | O(1) |
priority_queue value_type | O(1) | O(1) |