C++ STL学习——heap

本文介绍了如何使用C++ STL中的堆操作,包括构造、判断、插入和删除元素等,并通过示例代码演示了如何利用vector实现堆的操作。

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

C++ STL学习——heap

标签: heap c语言 STL
  1920人阅读  评论(0)  收藏  举报
  分类:
算法设计(79) 

      heap堆其实是一种比较复杂的数据结构,尤其涉及到建堆和调整堆的时候。好在在STL中已经封装了heap的一些操作,可以让我们比较方便的使用堆。比如判断堆,删除一个元素,插入一个元素,以及堆排序。示例代码上传至 https://github.com/chenyufeng1991/STL_heap 。

(1)首先导入头文件<algorithm>.

(2)这里使用数组来存储一个堆,也就是堆化数组,为了方便使用,我把数组转化为vector来操作。

[cpp]  view plain  copy
  1. int arr[] = {4,5,6,7,8,1};  
  2. vector<int>vectorArr(arr,arr + sizeof(arr) / sizeof(int));  


(3)is_heap:判断堆

[cpp]  view plain  copy
  1. cout <<"-"<<is_heap(vectorArr.begin(), vectorArr.end()) << endl;  

此时输出肯定为false;


(4)make_heap:构造堆

[cpp]  view plain  copy
  1. // 构造最大堆  
  2.     make_heap(vectorArr.begin(), vectorArr.end(), less<int>());  
  3.     cout <<"_ _"<<is_heap(vectorArr.begin(), vectorArr.end()) << endl;  

注意make_heap的第三个参数中,less<int>()为构造最大堆,greater<int>()为构造最小堆。此时判断is_heap即为true;


(5)push_heap:插入元素

[cpp]  view plain  copy
  1. // 向堆中插入一个元素,默认插入在顶部  
  2.     vectorArr.push_back(100);  
  3.     cout << "_ _ _"<<is_heap(vectorArr.begin(), vectorArr.end()) << endl;  
  4.   
  5.     push_heap(vectorArr.begin(), vectorArr.end());  
  6.     cout <<"_ _ _ _"<<is_heap(vectorArr.begin(), vectorArr.end()) << endl;  

如果要在堆中插入一个元素,首先要往容器vector尾部中插入该元素,然后再使用push_heap调整堆。


(6)pop_heap:弹出元素

[cpp]  view plain  copy
  1. // 弹出一个元素,默认是首元素和尾元素交换,交换以后就不是正确的堆了;真正的删除需要去vector里面pop;  
  2.     pop_heap(vectorArr.begin(), vectorArr.end());  
  3.     cout <<"_ _ _ _ _"<<is_heap(vectorArr.begin(), vectorArr.end()) << endl;  
  4.   
  5.     vectorArr.pop_back();  
  6.     cout <<"_ _ _ _ _ _"<<is_heap(vectorArr.begin(), vectorArr.end()) << endl;  

弹出的元素默认的是根节点的元素,然后在用尾元素放到根节点处,然后再调整。   pop_heap之后并没有真正删除该元素,最后是使用容器pop_back来删除的。


(7)sort_heap:堆排序

[cpp]  view plain  copy
  1. // 堆排序, 堆排序后  
  2.     sort_heap(vectorArr.begin(), vectorArr.end());  
  3.     cout <<"_ _ _ _ _ _ _"<<is_heap(vectorArr.begin(), vectorArr.end()) << endl;  
  4.     for (int i = 0; i < vectorArr.size(); i++)  
  5.     {  
  6.         cout << vectorArr[i] << " ";  
  7.     }  

堆排序后不是一个真正的堆了,只是完成了排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值