2024年STL之堆操作_stl堆,C C++核心知识点

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

               Compare comp);

push\_heap()是在堆的基础上进行数据的插入操作,参数与make\_heap()相同。   
 需要注意的是,只有`make_heap()` 和`push_heap()`同为大顶堆或小顶堆,才能插入。


##### 在堆中删除数据


要先调用pop\_heap()再在容器中删除数据。



template
void pop_heap (RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void pop_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp);


pop\_heap()是在堆的基础上,弹出堆顶元素。   
 这里需要注意的是,**pop\_heap()并没有删除元素**,而是将堆顶元素和数组最后一个元素进行了替换,如果要删除这个元素,还需要对数组进行pop\_back()操作。 


##### 二、测试


##### 建堆操作



#include
#include
#include
#include
#include
using namespace std;

void printVec(vector nums)
{
for(int i=0;i<nums.size();++i)
{
cout<<nums[i]<<" ";
}

cout<<endl;

}
int main(int argc, const char * argv[]) {

int nums_arr[] ={3,2,4,1,5};
vector nums(nums_arr,nums_arr+5);

//默认建立大顶堆
cout<<“(default) make_heap:”<<endl;
make_heap(nums.begin(),nums.end());
printVec(nums);

//建立大顶堆
cout<<“(less) make_heap:”<<endl;
make_heap(nums.begin(),nums.end(),less());
printVec(nums);

//建立小顶堆
cout<<“(greater) make_heap:”<<endl;
make_heap(nums.begin(),nums.end(),greater());
printVec(nums);

return 0;

}


输出:



(default) make_heap:
5 3 4 1 2
(less) make_heap:
5 3 4 1 2
(greater) make_heap:
1 2 4 3 5


##### 大顶堆操作


这里建立一个大顶堆,之后对在大顶堆上插入元素、删除元素。



//建立大顶堆
cout<<“(less) make_heap:”<<endl;
make_heap(nums.begin(),nums.end(),less());
printVec(nums);

//加入新数据 先在容器中加入,再调用push_heap()
nums.push_back(6);
push_heap(nums.begin(),nums.end(),less());
cout<<“插入元素6”<<endl;
printVec(nums);

//弹出堆顶元素,进行pop_back()操作
pop_heap(nums.begin(),nums.end(),less());
cout<<" 删除堆顶元素前"<<endl;
printVec(nums);
cout<<" 删除堆顶元素后"<<endl;
nums.pop_back();
printVec(nums);


输出:



(less) make_heap:
5 3 4 1 2
插入元素6
6 3 5 1 2 4
删除堆顶元素前
5 3 4 1 2 6
删除堆顶元素后
5 3 4 1 2


通过输出可以验证之前的一句话:   
 **pop\_heap()并没有删除元素**,而是将堆顶元素和数组最后一个元素进行了替换,如果要删除这个元素,还需要对数组进行pop\_back()操作。 


##### 三、剑指offer-数据流的中位数


###### 题目描述


如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。


###### 主要思想:


最大堆 | 最小堆


我们将数据分为两部分,位于左边最大堆的数据比右边最小堆的数据要小,左、右两边内部的数据没有排序,也可以根据左边最大的数及右边最小的数得到中位数。


接下来考虑用最大堆和最小堆实现的一些细节。


首先要保证数据平均分配到两个堆中,因此两个堆中数据的数目之差不能超过1.为了实现平均分配,可以在数据的总数目是偶数时把新数据插入到最小堆中,否则插入到最大堆中。


此外,还要保证最大堆中所有数据小于最小堆中数据。所以,新传入的数据需要先和最大堆的最大值或者最小堆中的最小值进行比较。   
 以总数目为偶数为例,按照我们制定的规则,新的数据会被插入到最小堆中,但是在这之前,我们需要判断这个数据和最大堆中的最大值谁更大,如果最大堆中的数据比较大,那么我们就需要把当前数据插入最大堆,然后弹出新的最大值,再插入到最小堆中。由于最终插入到最小堆的数字是原最大堆中最大的数字,这样就保证了最小堆中所有数字都大于最大堆的数字。



class Solution {
public:
void Insert(int num)
{
int size = max.size() + min.size();
if ((size & 1) == 0) //容器元素为偶数时,在最小堆插入
{
//找到最大堆中最大的元素
if (max.size() > 0 && num < max[0])

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值