来自度娘的释义,堆的含义大概是这样的:

感性理解:

堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

理性理解:

堆的定义如下:
  n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
  (ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)

然而手写堆实在太困难有点长了,在NOIp&&NOI赛场上时间有限,所以一个模板的重要性不言而喻;(比如我排序向来都是sort

会手写堆的都是神犇!

真的!

反正我写不了2333

所以上帝为可爱的c++党准备了贴身的STL模板-->heap;

1.make_heap 构建堆

  默认用法 (但这样生成的是大根堆;如果需要构建小根堆,需要进行修改。

    Eg:

 vector<int> v{, , , , , };
make_heap(v.begin(), v.end());

  

  自建小根堆  

    Eg:自定义比较函数:(似乎是这样我并不太懂

 vector<int> v{, , , , , };
make_heap(v.begin(), v.end(), greater<int>());

    这里使用了greater<int>()来代替默认的less<int>()来创建int类型的heap。

    可以按层次遍历的顺序把这个heap画出来,可以看到它跟默认情况刚好相反,会是一个小顶堆。

2. push_heap 把指定区间的最后一个元素插入到堆中

  v.push_back();

push_heap(v.begin(), v.end());  

注意:需要满足的是此时的v必须满足是一个在区间(v.begin(), v.end())内满足堆的性质;不能直接比较23333

所以我一直觉得即使手写堆也可以使用模板

毕竟我不会写

这样就比较简单。

3. pop_heap 把指定区间的最后一个元素插入到堆中

比如这样:

pop_heap(v.begin(), v.end());

auto largest = v.back();

psln(largest);

v.pop_back();

依旧需要满足v是一个堆;

而且他会将除最大值以外的节点重排;而v.back( )便将其找到了;

所以删除它只需要令v.back()=0就行了。

海星

3. pop_heap 把指定区间的最后一个元素插入到堆中

sort_heap(v.begin(), v.end());
printContainer(v, "after sort_heap: ");

堆排序;

没了

c++11里面的玄学东西高考完再说

现在不敢用

毕竟我是一个联赛选手

引用资料:

  • 【C++ STL应用与实现】72: 标准库里的堆--如何使用标准库的heap算法 https://blog.csdn.net/elloop/article/details/53402209

  • 百度百科 堆  https://baike.baidu.com/item/%E5%A0%86/20606834?fr=aladdin

当堆遇到STL 代码焕发光芒的更多相关文章

  1. 树、图、堆、STL(来自菜鸡的"炒鸡"干粮)

    树.图.堆.STL 图论基础 简单图: 没有自环,两个顶点之间最多只有一条边. 完全图: 一个简单图,每两个顶点之间都有一条边.一共有(n-1)*n/2条边. 二分图: 一个简单图,设G=(V,E)是 ...

  2. 最小堆的两种实现及其STL代码

    #include<cstdio> #include<iostream> #include<algorithm> #include<vector> boo ...

  3. 堆以及stl堆的使用

    概念 性质: 1.堆是一颗完全二叉树,用数组实现.    2.堆中存储数据的数据是局部有序的. 最大堆:1.任意一个结点存储的值都大于或等于其任意一个子结点中存储的值.      2.根结点存储着该树 ...

  4. STL 堆的使用

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

  5. 基于STL的堆略解

    什么是STL 以下内容摘自这儿. STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Le ...

  6. STL学习之路

    本文面向的读者:学习过C++程序设计语言(也就是说学习过Template),但是还没有接触过STL的STL的初学者.这实际上是我学习STL的一篇笔记,老鸟就不用看了. 什么是泛型程序设计 我们可以简单 ...

  7. 基本数据结构——堆(Heap)的基本概念及其操作

    基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...

  8. 堆应用---构造Huffman树(C++实现)

    堆: 堆是STL中priority_queue的最高效的实现方式(关于priority_queue的用法:http://www.cnblogs.com/flyoung2008/articles/213 ...

  9. C++STL模板库序列容器之vector

    目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...

随机推荐

  1. nginx 常见错误释义

    错误信息 错误说明 "upstream prematurely(过早的) closed connection" 请求uri的时候出现的异常,是由于upstream还未返回应答给用户 ...

  2. 数据库常见索引解析(B树,B-树,B+树,B*树,位图索引,Hash索引)

    B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...

  3. ModelValidator基于元数据的验证

    ModelValidator主要是应用在ModelMetadata元数据的类型上或类型属性上.它是验证的基础类型,所有的ModelValidatorProviders.DataAnnotationVa ...

  4. .Net中验证码图片生成

    开发网站或平台系统,登录页面是必不可少的功能,但是现在很多人可以使用工具暴力破解网站密码,为了防止这类非法操作,需要在登录页面添加验证,验证码就是最常用的一种验证方式. 我结合了自己的经验和网上的验证 ...

  5. 《Python黑帽子:黑客与渗透测试编程之道》 自动化攻击取证

    工具安装: 下载源码:https://code.google.com/archive/p/volatility/downloads 工具配置: 获取内存镜像:https://www.downloadc ...

  6. Apache VirtualHost的配置

    自从电脑更换为mac后, 一直没有时间去配置php的环境.导致每次要更改php代码的时候, 都是本地更改,然后直接推送到服务器上运行 这样的开发和测试及其耗时且繁琐, 所以早上特地决定弄好mac下的p ...

  7. ASP.NET Core 2.0 多应用实现Cookie共享

    前言 .NET Core 2.0 发布之后,在Authentication中间件部分,相关API有不少改动(官方文档),本文主要讲的就是实现应用Cookie共享,对Cookie中间件使用不了解的可以去 ...

  8. flask_mail发送邮件(附源码)

    文章介绍如何用flask_mail发送QQ邮件,发送其它邮箱简单的更改相应配置即可 传送门:源代码 源代码地址:https://github.com/1417766861/flask_mail 首先展 ...

  9. python2和3的区别 高清大图:)

    点击图片,新标签中打开查看!或右键‘图片另存为’!

  10. Proxy代理模式(结构型模式)

    1.问题 在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给调用者带来麻烦,那么如何在不损失接口透明性的情况下,解决这些麻 ...