STL 堆的使用

本来是要写leetcode上的merge k sorted lists那道题目,这个题目我还是很熟悉的,毕竟是看过算法导论的人,但是写的过程中对堆的维护代码还是挺多的,所以我想到了STL中的堆。下面就来学习一下这个STL。

先介绍一个非常好的学习C++的网站 http://www.cplusplus.com/ 这个网站对C++的理解还是很好的,个人觉得比msdn要好不知道哪里去了。

对堆的操纵主要有以下四个:

make_heap, pop_heap, push_heap, sort_heap

他们的函数原型就不说了,需要说明的就是这些函数的操作和算法导论上的算法是一样的,有一些需要注意的细节是make_heap,pop_heap,push_heap,sort_heap三个参数的形式,他们第三个参数都是判断大小的函数,而这个函数就是他们这三个函数维护堆的比较函数,例如:

void pop_heap (RandomAccessIterator first, RandomAccessIterator last,
                 Compare comp);
        vector<int> a = { 3, 5, 6, 7, 8, 1, 3, 6, 12, 78, };
    make_heap(a.begin(), a.end(),greater<int>());
    cout << a.front() << endl;

    pop_heap(a.begin(),a.end(),greater<int>());
    for (int i = 0; i < a.size(); i++)
    {
        cout << a[i] << endl;
    }
    a.pop_back();    

这个pop_heap操作是先把堆顶的元素拿出来,然后通过comp去维护堆(这里应该是把队尾的元素放到第一个去维护),然后在把之前堆顶的那个放到队尾。

所以comp是维护的基本,所以一般四个函数除非有特殊需求,要求comp必须相同。

时间: 2024-08-03 18:01:34

STL 堆的使用的相关文章

64 - 数据流中的中位数 || STL 堆

题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 思路解析 数据是从数据流读出,因此数组的个数是再逐渐的增加.如何选用一个容器,能够存储数据,并能够给出中位数. 无序数组:插入O(1) partation操作找出中位数 O(n) 有序数组:插入O(n) 找出中位数O(1) 有序链表:插入O(n) 找出中位数O(1) 搜索二叉树:插入O(logn)~O(

C++ STL堆操作

/* STL 最大堆.最小堆的应用 */ #include <iostream> #include <vector> #include <algorithm> // using namespace std; /* STL 堆操作 (1)make_heap()构造堆 void make_heap(first_pointer,end_pointer,compare_function); 默认比较函数是(<),即最大堆. 函数的作用是将[begin,end)内的元素处理

STL 堆

洛谷P3378 [模板]堆 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; const int N=1e6+5; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if

最小的n个和(STL堆的运用)

最小的n个和 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 109(26 users) Total Accepted: 22(19 users) Rating:  Special Judge: No Description 给定A.B两个数列,各包含n个数,分别从A和B中任意取一个数相加得到和,这样会有n^2种结果(包括重复的),求n^2个结果中前n个最小的和. Input 有多组测试数据. 对于每组测试数据,第一行为n,第二行为

stl 优先队列(堆)

[模板]堆 题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: 第一行包含一个整数N,表示操作的个数 接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下: 操作1: 1 x 操作2: 2 操作3: 3 输出格式: 包含若干行正整数,每行依次对应一个操作2的结果. 输入输出样例 输入样例#1: 5 1 2 1 5 2 3 2 输出样例#1:

STL源码笔记(15)—堆和优先级队列(二)

STL源码笔记(15)-堆和优先级队列 优先级队列的源码实现基于heap的操作,底层容器默认是vector. 优先级队列简介 优先级队列跟队列类似,一端插入一端删除,不同的是,优先级队列的元素入队后会根据其优先级进行调整,默认情况下优先级高的将优先出队,在SGI STL中,优先级队列的功能保证由heap实现:stl_heap.h中,heap的分析见:STL堆源码分析 优先级队列构造函数 默认情况下,优先级队列使用vector作为底层容器,使用less作为比较函数,其在源码中的定义声明如下: te

【STL学习】堆相关算法详解与C++编程实现(Heap)

转自:https://blog.csdn.net/xiajun07061225/article/details/8553808 堆简介 堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级队列(Priority Queue)等等. 堆是一种完全二叉树,因此我们可以用数组来存储所有节点.在这里的实现中,采用了一个技巧:将数组中索引为0的元素保留,设置为极大值或者为极小值(依据大顶堆或者小顶堆而定).那么当某个节点的索引是i时,其左子节点索引为2*i,右子节点索引为2*i+1.父节点是i/2

堆——练习题

--堆是一个很好用的东西,但遗憾的是,在oi混了三年多的我居然到现在才会--惭愧惭愧-- 堆可以在O(log n) 的时间内查询最大值和最小值,非常好用的一个数据结构,本人认为比优先队列快得多--只是本人观点-- 手写堆:不好写--没写过--反正c++有stl库(等到了左偏树再学--) stl堆:感谢c++有stl这种省时省力的好东西,要是noip开放所有库并允许o2 o3优化就更好了(退役之前不用想了) stl堆函数: make_heap:将一个数组建堆,例:对a[1]到a[100]建堆:ma

C++ 用template实现的堆

堆简介 堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级队列(Priority Queue)等等. 堆是一种完全二叉树,因此我们可以用数组来存储所有节点.在这里的实现中,采用了一个技巧:将数组中索引为0的元素保留,设置为极大值或者为极小值(依据大顶堆或者小顶堆而定).那么当某个节点的索引是i时,其左子节点索引为2*i,右子节点索引为2*i+1.父节点是i/2(这里/表示高斯符号,取整).这种以数组表示树的方式,我们成为隐式表述法(implicit reprentation).我们这里