STL 堆的基本用法

今天做到一道题,用到了堆(heap)这种数据结构。之前学数据结构的时候自己也实现过,但是刷题的时候还是无脑用STL吧😂。

然后我就突然发现自己从来没用过STL里面的堆,于是在这里记一下基本用法,免得后面又去网上搜。

我们先定义一个数组
vector<int> nums = {3,2,3,1,2,4,5,5,6};

然后使用 make_heap() 函数把这个数组建成堆。注意,STL里面的堆相关的功能都是在 #include < algorithm > 中定义的,所以用之前别忘了导入这个。

make_heap()的用法如下:
make_heap(nums.begin(), nums.end());

其实跟STL里面的大部分接口保持一致,第3个参数也还可以传一个比较器,用于指明比较方法。例如:

make_heap(nums.begin(), nums.end(),greater<int>()); 将建立最小堆

make_heap(nums.begin(), nums.end(),less<int>()); 将建立最大堆

注意,上面两个不要记反了,最小堆传入的是greater,最大堆传入的是less

当然,你也可以取定义自己的比较器:

bool cmp(int& a, int& b){
    return a > b;
}

make_heap(nums.begin(), nums.end(), cmp);

我们以最大堆为例,来讲讲如何降序输出数组nums中的元素

void heapSort(vector<int>& nums){
    //升序->最大堆,降序->最小堆
    //auto cmp = less<int>();
    auto cmp = greater<int>();
    make_heap(nums.begin(), nums.end(), cmp);

    for(auto end = nums.end(); end != nums.begin(); end--){
        pop_heap(nums.begin(), end, cmp);
    }
}

首先将整个数组建成堆结构,然后每次输出堆顶元素,再使用
pop_heap(nums.begin(), end, less<int>());

这个函数的作用就是把堆顶元素移动到数组尾部,然后重新将数组nums.begin()和end之间的元素调整为最大堆。

注意,在调整的过程中记得更新end迭代器

需要注意的是pop_heap()函数并不是把堆顶元素从数组中移除,而是把它移动到数组尾部,这个和vector, stack, queue等结构的pop操作的语义是不同的。

如果我们需要插入一个元素,那么使用 push_heap() 函数即可,参数和上面两个一样。

posted @ 2021-01-21 23:03  nullxjx  阅读(522)  评论(0编辑  收藏  举报