STL_heap简单用法小记

1.头文件#include <algorithm>

  STL在algorithm.h 文件中实现了 对存储在数组或者vector中的元素进行相关堆化的 函数,包括 : make_heap, pop_heap, push_heap, sort_heap。
可以看出,heap实现有两层,底层是数组或者vector,上层是heap。

2.heap相关的四个函数

  1. make_heap( ):建立堆(要么大顶堆,要么小顶堆)
  2. push_heap( ): 在堆中添加元素
  3. pop_heap( ): 在堆中删除元素
  4. sort_heap( ): 堆排序
    函数参数:例如:make_heap(_First, _Last, _Comp)
    _First, _Last:可以随机访问的迭代器/ 指针
    _Comp: 比较函数(仿函数),其规则——如果函数的第一个参数小于第二个参数应返回true,否则返回false。默认less
    大根堆 :_Comp:参数为less()
    小根堆:为greater()
    不加则默认建立大根堆;

例子:

1.建堆,本例中使用vector来构建最小堆
2.调整堆
当使用上述的make_heap()建完堆后,如果vector使用push_back()插入数据或pop_back()删除数据后,会破坏最大堆/最小堆的性质,所以需要调整堆,常用push_heap()和pop_heap()两个方法。
1、push_heap()用法是,vector先push_back(),后push_heap():
2、pop_heap()用法是,先pop_heap(),vector后pop_back():
这里关注一下pop_heap的用法。通过堆的相关性质,我们知道在堆中删除一个元素,是为了把堆顶元素删除。如果我们先采用vector的pop_back(),则只是针对vector的最后一个元素。
而先pop_heap()的话,相当于是先把堆顶元素放到了vector的最后一个位置,然后对其前面的数字重新建立了一个堆,之后把在vector最后位置的原堆顶元素pop,就得到了新堆。如果还熟悉堆的数据结构和相关操作的话,这就是从堆中删除元素的步骤了。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void print_heap(vector<int> &v){
    for(vector<int>:: iterator it =v.begin();it!=v.end();++it){
            cout<<*it<<' ';

        }
    cout<<'\n'<<endl;
}
int main(){
    vector<int> min = {10,30,22,6,15,9};
    make_heap(min.begin(),min.end(), greater<int>());
    print_heap(min);

    min.push_back(20);
    push_heap(min.begin(),min.end(),greater<int>());
    print_heap(min);

    pop_heap(min.begin(),min.end(),greater<int>());
    min.pop_back();
    print_heap(min);
            
    sort_heap(min.begin(),min.end(),greater<int>());
    print_heap(min);
            
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信仿真爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值