定义
一种特殊的队列,其中的元素并非按照“先进先出”(FIFO)的顺序排列,而是根据元素的优先级来决定出队顺序。优先级最高的元素总是位于队列的前端
- 最大堆(默认):
priority_queue默认实现为一个最大堆(max-heap),即最大的元素(根据比较规则)拥有最高优先级,位于队首。 - 堆结构:底层通常使用
std::vector实现,并通过堆(通常是二叉堆)的性质来维护元素的顺序。 - 访问限制:你只能访问和移除优先级最高的那个元素(队首)。不能遍历整个队列,也不能直接访问其他元素。
- 动态大小:大小可以动态增长
- 只能通过
top函数获取元素
构造函数
1、默认构造函数
int main()
{
system("chcp 65001");
// 默认构造函数
priority_queue<int> queue1;
queue1.push(1);
queue1.push(33);
queue1.push(2);
while (!queue1.empty())
{
cout << "queue1-> " << queue1.top() << endl;
queue1.pop();
}
}
2、带有比较函数的构造函数
int main()
{
system("chcp 65001");
// 带有自定义比较函数的构造函数
std::priority_queue<int, std::vector<int>, std::greater<int>> queue1;
queue1.push(1);
queue1.push(33);
queue1.push(2);
while (!queue1.empty())
{
cout << "queue1-> " << queue1.top() << endl;
queue1.pop();
}
}
3、区间构造函数
int main()
{
system("chcp 65001");
// 区间构造函数
std::vector<int> vec = { 3, 1, 4, 11, 5, 9 };
std::priority_queue<int> queue1(vec.begin() + 1, vec.end() - 1);
queue1.push(1);
queue1.push(33);
queue1.push(2);
while (!queue1.empty())
{
cout << "queue1-> " << queue1.top() << endl;
queue1.pop();
}
}
4、组合构造函数
int main()
{
system("chcp 65001");
// 组合构造函数
std::vector<int> vec = { 3, 1, 4, 11, 5, 9 };
auto comp = [](int a, int b) { return a > b; };
std::priority_queue<int, std::vector<int>, decltype(comp)> queue1(vec.begin(), vec.end(), comp);
queue1.push(1);
queue1.push(33);
queue1.push(2);
while (!queue1.empty())
{
cout << "queue1-> " << queue1.top() << endl;
queue1.pop();
}
}
5、拷贝构造函数
int main()
{
system("chcp 65001");
std::priority_queue<int> queue1;
queue1.push(1);
queue1.push(33);
queue1.push(2);
// 拷贝构造函数
std::priority_queue<int> queue2(queue1);
while (!queue2.empty())
{
cout << "queue1-> " << queue2.top() << endl;
queue2.pop();
}
}
6、移动构造函数
int main()
{
system("chcp 65001");
std::priority_queue<int> queue1;
queue1.push(1);
queue1.push(33);
queue1.push(2);
// 移动构造函数
std::priority_queue<int> queue2(std::move(queue1));
while (!queue2.empty())
{
cout << "queue1-> " << queue2.top() << endl;
queue2.pop();
}
}
常用函数
| 函数 | 描述 |
|---|---|
push(value) | 将 value 插入优先队列。时间复杂度 O(log n) |
emplace(args...) | 在容器内就地构造一个元素并插入。比 push 更高效,不用复制。O(log n) |
pop() | 移除优先级最高的元素(队首元素)。时间复杂度 O(log n) |
top() | 返回优先级最高元素(队首元素)的常量引用。时间复杂度 O(1。 |
empty() | 如果队列为空,返回 true。O(1) |
size() | 返回队列中元素的数量。O(1) |
swap(other) | 与另一个 priority_queue 交换内容。O(1) |
int main()
{
system("chcp 65001");
std::priority_queue<int> queue1;
queue1.push(1);
queue1.push(33);
queue1.push(2);
queue1.emplace(15);
cout << "queue1.size()-> " << queue1.size() << endl;
cout << "queue1.empty()-> " << boolalpha << queue1.empty() << endl;
while (!queue1.empty())
{
cout << "queue1-> " << queue1.top() << endl;
queue1.pop();
}
}
9729

被折叠的 条评论
为什么被折叠?



