属性和方法
std::priority_queue
是 C++ STL 中的一个容器适配器,它提供了一些基本属性和方法,用于管理基于优先级的队列。以下是 std::priority_queue
的主要属性和方法:
1. 构造函数
默认构造函数:
std::priority_queue<T>
:创建一个空的优先队列,其中T
是存储的数据类型。
带容器和比较函数的构造函数:
std::priority_queue<T, Container, Compare>
:创建一个指定底层容器和比较方式的优先队列,Container
默认是std::vector<T>
,Compare
默认是std::less<T>
(大顶堆)。
2. 属性
类型定义:
value_type
:存储的元素类型。container_type
:底层容器的类型(默认为std::vector<T>
)。size_type
:大小类型,用于存储优先队列中元素个数的数据类型。reference
:返回元素的引用类型。const_reference
:返回常量元素的引用类型。
3. 成员方法
3.1 元素访问
top()
:功能:返回队列中优先级最高的元素(对于大顶堆是最大元素)。
复杂度:O(1)。
示例:
std::priority_queue<int> pq; pq.push(10); pq.push(5); pq.push(20); std::cout << pq.top(); // 输出 20
3.2 容量相关
empty()
:功能:检查优先队列是否为空。如果为空,返回
true
,否则返回false
。复杂度:O(1)。
示例:
if (pq.empty()) { std::cout << "Queue is empty"; }
size()
:功能:返回优先队列中元素的数量。
复杂度:O(1)。
示例:
std::cout << "Size: " << pq.size(); // 输出优先队列的元素数量
3.3 修改容器
push(const value_type& val)
:功能:将元素
val
插入到优先队列中。复杂度:O(log n),因为插入后需要维护堆结构。
示例:
pq.push(15); // 插入 15 到优先队列
emplace(Args&&... args)
:功能:原位构造一个对象并插入到优先队列中,避免了复制操作。
复杂度:O(log n)。
示例:
pq.emplace(25); // 原位构造并插入 25
pop()
:功能:移除优先级最高的元素(对于大顶堆是最大元素)。
复杂度:O(log n),因为移除后需要维护堆结构。
示例:
pq.pop(); // 移除优先级最高的元素
3.4 交换内容
swap(priority_queue& other)
:功能:与另一个优先队列
other
交换元素。复杂度:O(1)。
示例:
std::priority_queue<int> pq1, pq2; pq1.push(10); pq2.push(20); pq1.swap(pq2); // 交换两个优先队列的内容
4. 比较函数
std::priority_queue
的默认比较方式是 std::less<T>
,即大顶堆。如果需要自定义优先级,可以传入自定义的比较器,例如使用 std::greater<T>
实现小顶堆。
示例:使用 std::greater<T>
实现小顶堆
#include <queue>
#include <vector>
#include <iostream>
int main() {
std::priority_queue<int, std::vector<int>, std::greater<int>> pq; // 小顶堆
pq.push(10);
pq.push(5);
pq.push(20);
std::cout << pq.top(); // 输出 5
}
5. 总结
top()
返回优先级最高的元素(不移除)。
O(1)
push(const T& val)
插入新元素,并重新调整堆。
O(log n)
emplace(Args&&... args)
原位构造新元素并插入队列。
O(log n)
pop()
移除优先级最高的元素,并重新调整堆。
O(log n)
empty()
检查优先队列是否为空。
O(1)
size()
返回优先队列中的元素数量。
O(1)
swap(priority_queue& other)
交换两个优先队列的内容。
O(1)
std::priority_queue
是一个灵活的容器,适用于需要管理具有优先级的任务或数据的场景,如贪心算法、调度系统等。
Last updated