容器适配器————heap

堆(heaps)不是容器,而是一种特别的数据组织方式。堆一般用来保存序列容器

堆是一个完全二叉树,每个节点与其子节点位置相对。父节点总是大于或等于子节点,这种情况下被叫作大顶堆,或者父节点总是小于或等于子节点,这种情况下叫作小顶堆。注意,给定父节点的子节点不一定按顺序排列。

创建堆

用来创建堆的函数定义在头文件 algorithm 中。max_heap() 对随机访问迭代器指定的一段元素重新排列,生成一个堆。默认使用的是 < 运算符,可以生成一个大顶堆。

make_heap(iterator first,iterator last);//将[first,last)范围进行堆排序,默认less<int>(),降序
make_heap(iterator first,iterator last,less<int>());
make_heap(iterator first,iterator last,greater<int>());//升序

堆操作

堆不是容器,而是组织容器元素的一种特别方式。只能确定堆的范围,即开始和结束迭代器指定的范围。这意味着可以用容器中的元素子序列创建堆。可以在已生成的堆中添加元素。

pop_heap() 

将front移动到end前一位,即末尾,然后将剩下的元素重新堆排序成一个新heap,使用的规则要个make_heap一样。

pop_heap(iterator first ,iterator last, cmpObject);

 

push_heap()

对刚插入尾部push_back元素后做堆排序。

push_heap(iterator first ,iterator last, cmpObject)

 

sort_heap()

将一个做排序,最终成为一个有序的系列,可以看到sort_heap时,必须先是一个堆(两个特性:1、最大元素在第一个 2、添加或者删除元素以对数时间),因此必须先做一次make_heap。

sort_heap(iterator first ,iterator last, cmpObject)

 

转载于:https://www.cnblogs.com/pacino12134/p/11442397.html

### C++ 中 Heap 数据结构的实现用法 #### 1. 堆的概念及其特性 堆是一种特殊的完全二叉树,分为最大堆和最小堆两种形式。在最大堆中,父节点的关键字总是大于或等于子节点关键字;而在最小堆中则相反。这种性质使得堆成为优先队列的理想选择[^3]。 #### 2. 使用 STL 容器适配器 `priority_queue` 实现堆 C++ 提供了标准模板库(STL),其中包含了可以直接使用的堆——即优先级队列(priority queue)。下面是一个简单的例子来展示如何利用 `std::priority_queue<int>` 来构建一个整数的最大堆: ```cpp #include <iostream> #include <queue> int main() { std::priority_queue<int> max_heap; // 插入元素到堆中 int array[] = {20, 12, 35, 15, 10, 80, 30, 17, 2, 1}; for(auto& elem : array){ max_heap.push(elem); } while (!max_heap.empty()) { std::cout << "Top element is: " << max_heap.top() << '\n'; max_heap.pop(); } } ``` 这段代码展示了通过向 `std::priority_queue<int>` 添加一系列数值并依次取出顶部最大的值的过程[^4]。 对于自定义类型的对象来说,如果想要将其放入堆中,则需要重载小于运算符 `<` 或者提供比较函数作为第三个参数给定构造函数。 #### 3. 手动实现简单版本的最大堆类 MaxHeap 除了使用内置的支持外,还可以自己动手编写一个简易版的最大堆类 `MaxHeap`: ```cpp class MaxHeap { private: vector<int> elements; public: void insert(int value); // 向堆里加入新元素 bool empty() const; // 判断当前堆是否为空 int top(); // 获取堆顶元素(最大值) void pop_top(); // 移除堆顶元素 }; void MaxHeap::insert(int value) { this->elements.push_back(value); size_t i = this->elements.size()-1; while(i != 0 && this->elements[parent(i)] < this->elements[i]){ swap(this->elements[parent(i)],this->elements[i]); i=parent(i); } } bool MaxHeap::empty()const{ return this->elements.empty(); } int MaxHeap::top(){ if(!this->empty()){ return this->elements.front(); }else{ throw runtime_error("The heap is empty"); } } void MaxHeap::pop_top(){ if(elements.size()>1){ swap(elements[0],elements.back()); elements.pop_back(); make_heap(elements.begin(),elements.end()); } else if(!elements.empty()){ elements.clear(); } } ``` 上述实现了基本功能的手工最大堆类,包括插入、获取顶端元素以及删除顶端元素等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值