heap —— 堆

1、C++ STL中的 heap(堆)数据结构是一棵完全二叉树。在标准库中heap算法是在 algorithm 头文件中,提供了如下的几个操作的函数。

以下函数默认的第三个参数都是最大堆时的参数。若要使用最小堆,则需要显式的将第三个参数设为greater

  • make_heap():根据指定的迭代器区间,来创建一个堆。
vector<int> v = { 10,20,5,60 };

// 创建最大堆,默认是创建最大堆。该堆的最大元素为二叉树根节点的元素 v[0]或v.front()
make_heap(v.begin(), v.end(), less<int>());
// 创建最小堆,该堆中根节点的元素最小
make_heap(v.begin(), v.end(), greater<int>());

  • push_heap():把指定迭代区间的最后一个元素插入到heap中,常常和vector配合使用。
v.push_back(100);
push_heap(v.begin(), v.end(),less<int>()); //将容器末尾的值插入到堆的合适位置.

  • pop_heap:将指定迭代区中的最后一个元素置于容器的末尾
// 将最大堆中的根节点元素置于容器的尾部,并未删除
pop_heap(v.begin(), v.end(), less<int>()); 
v.pop_back();//删除容器末尾的元素。

  • sort_heap:进行堆排序

2、示例代码如下

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	int arr[] = { 10,20,3,40,18 };
	int len = sizeof(arr) / sizeof(arr[0]);
	vector<int> vec(arr, arr + len); //用数组来初始化容器

	make_heap(vec.begin(), vec.end()); //以容器vec中的元素来建立堆,默认是最大堆
	cout << "The max heap: " << vec.front() << '\n';// 首元素为容器中的最大值

	pop_heap(vec.begin(), vec.end());//将迭代器区间中的最大元素置于vector容器的末尾
	vec.pop_back();//将此最大值删除
	cout << "max heap after pop: " << vec.front() << '\n';

	vec.push_back(99);//向容器末尾插入值
	push_heap(vec.begin(), vec.end());//将指定区间的最后一个元素插入到heap中
	cout << "max heap after push: " << vec.front() << '\n';

	sort_heap(vec.begin(), vec.end());//对堆进行排序

	cout << "final sorted range: ";
	for (auto &i:vec)
	{
		cout << i << " ";
	}

	cout << endl;
	system("pause");


}

输出结果如下:
在这里插入图片描述


参考资料:
STL——heap结构及算法
make_heap
C++ 标准库中的堆(heap)
STL中heap相关函数

发布了213 篇原创文章 · 获赞 48 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/Jeffxu_lib/article/details/104703706