当堆遇到STL 代码焕发光芒
来自度娘的释义,堆的含义大概是这样的:
感性理解:
堆(英语: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 代码焕发光芒的更多相关文章
- 树、图、堆、STL(来自菜鸡的"炒鸡"干粮)
树.图.堆.STL 图论基础 简单图: 没有自环,两个顶点之间最多只有一条边. 完全图: 一个简单图,每两个顶点之间都有一条边.一共有(n-1)*n/2条边. 二分图: 一个简单图,设G=(V,E)是 ...
- 最小堆的两种实现及其STL代码
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> boo ...
- 堆以及stl堆的使用
概念 性质: 1.堆是一颗完全二叉树,用数组实现. 2.堆中存储数据的数据是局部有序的. 最大堆:1.任意一个结点存储的值都大于或等于其任意一个子结点中存储的值. 2.根结点存储着该树 ...
- STL 堆的使用
本来是要写leetcode上的merge k sorted lists那道题目,这个题目我还是很熟悉的,毕竟是看过算法导论的人,但是写的过程中对堆的维护代码还是挺多的,所以我想到了STL中的堆.下面就 ...
- 基于STL的堆略解
什么是STL 以下内容摘自这儿. STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Le ...
- STL学习之路
本文面向的读者:学习过C++程序设计语言(也就是说学习过Template),但是还没有接触过STL的STL的初学者.这实际上是我学习STL的一篇笔记,老鸟就不用看了. 什么是泛型程序设计 我们可以简单 ...
- 基本数据结构——堆(Heap)的基本概念及其操作
基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...
- 堆应用---构造Huffman树(C++实现)
堆: 堆是STL中priority_queue的最高效的实现方式(关于priority_queue的用法:http://www.cnblogs.com/flyoung2008/articles/213 ...
- C++STL模板库序列容器之vector
目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...
随机推荐
- 【转】老左常用国内/国外VPS推荐
原文:http://www.laozuo.org 老左从使用虚拟主机到VPS,至今也用过不少的商家产品,比如在"TOP10美国虚拟主机/网站空间推荐"有分享目前和曾经使用的虚拟主机 ...
- 1月第2周业务风控关注|“扫黄打非”部门查处互动作业、纳米盒等20多个学习类App
易盾业务风控周报每周呈报值得关注的安全技术和事件,包括但不限于内容安全.移动安全.业务安全和网络安全,帮助企业提高警惕,规避这些似小实大.影响业务健康发展的安全风险. 1.全国"扫黄打非&q ...
- PS插件CameraRaw-HSL色彩模式
一.HSL百度百科 HSL色彩模式是工业界的一种颜色标准,是通过对色相(H).饱和度(S).明度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,HSL即是代表色相,饱和度,明度三 ...
- Linux系统软件包的管理(4)
虽然使用源码编译安装可以具有提高速度个性化的定制等优点,但对于 Linux发行商来说,则不容易管理软件包,毕竟不是每个人都会进行源码编译的,如果能够将软件预先在相同的硬体与系统上面编译好在发布的话,不 ...
- svn 设置 excel 比对工具为 SPREADSHEETCOMPARE.EXE
http://blog.csdn.net/ccpat/article/details/50725774
- [Swift]lower_bound和upper_bound
时间复杂度:一次查询O(log n),n为数组长度. [C++] lower_bound:返回大于等于val的第一个值 功能:查找非递减序列[first,last) 内第一个大于或等于某个元素的位置. ...
- Swift5 语言指南(二十六) 内存安全
默认情况下,Swift可以防止代码中发生不安全行为.例如,Swift确保变量在使用之前进行初始化,在取消分配后不访问内存,并检查数组索引是否存在越界错误. Swift还确保对同一内存区域的多次访问不会 ...
- linux 服务器脚本采集数据中文无法执行错误
问题描述:在 RHEL6 版本的服务器上使用脚本操作数据库,其中一个SQL的字段值为中文,每次使用 crontab定时 执行该脚本无法获取数据,实现预期效果,而手动执行正常. oracle clien ...
- markdown的学习记录
一.markdown用处: 写博客,写微信公众号等等 二.准备工作: 工具使用:由于代码经常使用idea,所以继续使用idea编写markdown,但需要安装插件:MarkDown Navigator ...
- [Umbraco] 熟悉管理页面
登录到umbraco管理界面后,发现其后台管理页很简洁 首页看到左侧部分是一个Content和Sections,右侧是管理区域 介绍各个Sections代表的含义: "Content&quo ...