堆的操作(make_heap,push_heap,pop_heap,sort_heap,is_heap)
堆不是一中sort ranges,堆中的元素不会以递增方式排列,内部以树状形式排列,该结构以每个结点小于等于父节点构成,优先队列就是以堆来实现
make_heap
//版本一:用operator <比较元素 template <class RandomAccessIterator> void make_heap(RandomAccessIterator first,RandomAccessIterator last); //版本二:用自定义的function object比较元素 template <class RandomAccessIterator,class StrictWeakOrdering> void make_heap(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);
push_heap
//版本一:用operator <比较元素 template <class RandomAccessIterator> void push_heap(RandomAccessIterator first,RandomAccessIterator last); //版本二:用自定义的function object比较元素 template <class RandomAccessIterator,class StrictWeakOrdering> void push_heap(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);
堆以[first,last-1)表示,新增加的元素为*(last-1);[first,last-1)为有效地range,也就是其不为空并且是一个堆
pop_heap
//版本一:用operator <比较元素 template <class RandomAccessIterator> void pop_heap(RandomAccessIterator first,RandomAccessIterator last); //版本二:用自定义的function object比较元素 template <class RandomAccessIterator,class StrictWeakOrdering> void pop_heap(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);
从堆中移除最大元素(即*first);[first,last-1)为有效地range,也就是其不为空;这两个版本的操作都有一个必然的结果:从堆中移除的元素是*(last-1),并且移除后为一个新堆
sort_heap
//版本一:用operator <比较元素 template <class RandomAccessIterator> void sort_heap(RandomAccessIterator first,RandomAccessIterator last); //版本二:用自定义的function object比较元素 template <class RandomAccessIterator,class StrictWeakOrdering> void sort_heap(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);
把堆转化为一个sorted ranges,不一定会保持等价元素的相对顺序
is_heap
//版本一:用operator <比较元素 template <class RandomAccessIterator> void is_heap(RandomAccessIterator first,RandomAccessIterator last); //版本二:用自定义的function object比较元素 template <class RandomAccessIterator,class StrictWeakOrdering> void is_heap(RandomAccessIterator first,RandomAccessIterator last,StrictWeakOrdering cmp);
测试一个序列是否是一个堆
#include <iostream> #include <vector> #include <iterator> #include <algorithm> using namespace std; int main() { vector<,,,,,,}; make_heap(v.begin(),v.end()-); for_each(v.begin(),v.end(),[](int i) { cout<<i<<" "; }); cout<<endl; push_heap(v.begin(),v.end()); for_each(v.begin(),v.end(),[](int i) { cout<<i<<" "; }); cout<<endl; cout<<is_heap(v.begin(),v.end())<<endl; sort_heap(v.begin(),v.end()); cout<<is_heap(v.begin(),v.end())<<endl; ; }
堆的操作(make_heap,push_heap,pop_heap,sort_heap,is_heap)的更多相关文章
- STL make_heap push_heap pop_heap sort_heap
make_heap: default (1) template <class RandomAccessIterator> void make_heap (RandomAccessItera ...
- POJ - 1456 贪心 堆常用操作 注意细节
题意:给定n个商品的deadline和profit,求每天卖一件的情况下的最大获利 显然是一道贪心 按deadline从小到大排序好,动态维护小根(profit)堆的大小<=当前deadline ...
- C#=> 栈模仿堆的操作
//原理,利用两个栈,互相作用,来模仿堆的效果,先进先出.. using System; using System.Collections.Generic; using System.Linq; us ...
- 论C++STL源代码中关于堆算法的那些事
关于堆,我们肯定熟知的就是它排序的时间复杂度在几个排序算法里面算是比較靠上的O(nlogn)常常会拿来和高速排序和归并排序讨论,并且它还有个长处是它的空间复杂度为O(1), 可是STL中没有给我们提供 ...
- 不要重复发明轮子-C++STL
闫常友 著. 中国铁道出版社. 2013/5 标准的C++模板库,是算法和其他一些标准组件的集合. . 1.类模板简介 2.c++中的字符串 3.容器 4.c++中的算法 5.迭代器 6.STL 数值 ...
- STL--STL和她的小伙伴们:
STL--概述: 标准模板库(StandardTemplateLibrary,STL),是C++程序设计语言标准模板库.STL是由Alexander Stepanov.Meng Lee和David R ...
- (转)c++一些知识点
异常详解: https://www.cnblogs.com/hdk1993/p/4357541.html#top 模版详解: https://blog.csdn.net/lezardfu/articl ...
- cb50a_c++_STL_算法_局部排序partial_sort
cb50a_c++_STL_算法_局部排序partial_sort partial_sort(b,se,e)排序一部分,begin,source end,endcout << " ...
- POJ 3784.Running Median
2015-07-16 问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数. 原题链接:http://poj.org/problem?id=3784 解题思路: 求取中 ...
随机推荐
- Java的file类
package IO; import java.io.File; import java.io.IOException; public class FileDemo01 { public static ...
- CentOS7安装Nginx及配置
Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.**它最常的用途是提供反向代理服务.** 安装 在Centos下,yum源不 ...
- day 74 json 和 ajax 的实例
一 json的定义: json(JavaScript object notation,js对象标记)是一种轻量级的数据交换格式,它基于ecmascript(w3c指定的js规范)的一个子集,采用完全独 ...
- python 正则匹配时间格式转换方法
import re from datetime import datetime a = '2018年8月9日 10:10' s = re.findall('\d+',a) print(s) d = ' ...
- HDU 6103 17多校6 Kirinriki(双指针维护)
Problem Description We define the distance of two strings A and B with same length n isdisA,B=∑i=0n− ...
- tmux-2.3 conf
set-window-option -g automatic-rename off set -g allow-rename off # 把前缀键从 C-b 更改为 C-a set -g prefix ...
- 【linux基础】使用命令行编译运行c++程序
前言 在linux系统运行程序,小鹅知道的有3种编译方式,一种是直接命令行编译,一种是使用Cmake,一种是使用脚本文件(*.sh).本文介绍的是使用命令行编译. 使用过程 注意不同系统的编译器版本可 ...
- Factor Graph因子图
参考链接1: 参考链接2: 参考ppt3: Factor Graph 是概率图的一种,概率图有很多种,最常见的就是Bayesian Network (贝叶斯网络)和Markov Random Fiel ...
- Gym101986: Asia Tsukuba Regional Contest(寒假自训第12场)
A .Secret of Chocolate Poles 题意:有黑白两种木块,黑色有1,K两种长度: 白色只有1一种长度,问满足黑白黑...白黑形式,长度为L的组合种类. 思路:直接DP即可. #i ...
- java-方法重写的注意事项
1.父类中私有方法不能被重写.因为父类的私有方法子类根本就无法继承. 2.子类重写父类方法时,访问权限不能更低.最好就一致. 3.父类静态方法,子类也必须通过静态方法进行重写.其实这个算不上方法重写, ...