C++STL堆操作

本文介绍了C++ STL中的堆操作,包括优先队列的定义、使用大根堆和小根堆的方法,以及一种快速实现堆的玄学技巧。文章提供了相关链接以供进一步学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


并没有什么用的更新时间

【2019/02/21】 第一次更新(疑似更完)
【2019/02/25】 相关链接更新


定义

优先队列
需要调动到#include<queue>,以下以a为例:
大根堆的调用:priority_queue<int>a;
小根堆的调用:priority_queue<int,vector<int>,greater<int> > a;


原因

以下以a为例:

a.size():返回堆内元素个数。
a.empty():如果堆为空,返回真,否则返回假。
a.top
### C++ STL操作与实现 #### 什么是是一种特殊的完全二叉树结构,在计算机科学中通常用于优先队列的实现。C++ 的标准模板库 (STL) 提供了一组函数来操作容器中的数据,使其满足最大或最小的要求。 #### 的主要特性 - **最大**:父节点总是大于等于其子节点[^1]。 - **最小**:父节点总是小于等于其子节点[^2]。 这些性质使得非常适合用来快速访问集合中的最大值或最小值。 #### 如何在 C++ STL 中使用C++ STL 提供了一系列算法函数来帮助我们构建和维护: 1. `std::make_heap` 将指定范围内的元素重新排列成一个。默认情况下会创建最大[^3]。 2. `std::push_heap` 当向容器中添加新元素后,调用此函数可以将新增加的元素纳入到现有的结构之中,保持的有效性[^4]。 3. `std::pop_heap` 此函数把当前堆顶元素移动到最后位置(通常是移除它),并调整剩余部分再次形成合法的[^5]。 以下是具体使用的代码示例: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> v = {10, 20, 30, 5, 7}; // 创建最大 std::make_heap(v.begin(), v.end()); // 输出初始的最大状态 for(auto &i : v){ std::cout << i << ' '; } std::cout << '\n'; // 向中插入新的元素 v.push_back(99); std::push_heap(v.begin(), v.end()); // 再次打印更新后的 for(auto &i : v){ std::cout << i << ' '; } std::cout << '\n'; // 移除堆顶元素 std::pop_heap(v.begin(), v.end()); // 将第一个元素移到最后 v.pop_back(); // 删除最后一个元素 // 打印最终结果 for(auto &i : v){ std::cout << i << ' '; } return 0; } ``` 上述程序展示了如何利用 STL 函数管理一个动态数组作为的数据存储方式,并执行基本的增删查改功能[^6]。 #### 自定义比较器 如果希望构建的是最小而不是默认的最大,则可以通过传递自定义比较器给以上提到的各种 heap 操作函数完成设置[^7]: ```cpp // 构建最小的例子 std::vector<int> vec = {10, 20, 30}; std::make_heap(vec.begin(), vec.end(), std::greater<int>()); ``` 这里通过提供第三个参数——即 functor 或 lambda 表达式形式的标准—实现了相反顺序关系下的化过程[^8]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值