堆不是一中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)的更多相关文章

  1. STL make_heap push_heap pop_heap sort_heap

    make_heap: default (1) template <class RandomAccessIterator> void make_heap (RandomAccessItera ...

  2. POJ - 1456 贪心 堆常用操作 注意细节

    题意:给定n个商品的deadline和profit,求每天卖一件的情况下的最大获利 显然是一道贪心 按deadline从小到大排序好,动态维护小根(profit)堆的大小<=当前deadline ...

  3. C#=> 栈模仿堆的操作

    //原理,利用两个栈,互相作用,来模仿堆的效果,先进先出.. using System; using System.Collections.Generic; using System.Linq; us ...

  4. 论C++STL源代码中关于堆算法的那些事

    关于堆,我们肯定熟知的就是它排序的时间复杂度在几个排序算法里面算是比較靠上的O(nlogn)常常会拿来和高速排序和归并排序讨论,并且它还有个长处是它的空间复杂度为O(1), 可是STL中没有给我们提供 ...

  5. 不要重复发明轮子-C++STL

    闫常友 著. 中国铁道出版社. 2013/5 标准的C++模板库,是算法和其他一些标准组件的集合. . 1.类模板简介 2.c++中的字符串 3.容器 4.c++中的算法 5.迭代器 6.STL 数值 ...

  6. STL--STL和她的小伙伴们:

    STL--概述: 标准模板库(StandardTemplateLibrary,STL),是C++程序设计语言标准模板库.STL是由Alexander Stepanov.Meng Lee和David R ...

  7. (转)c++一些知识点

    异常详解: https://www.cnblogs.com/hdk1993/p/4357541.html#top 模版详解: https://blog.csdn.net/lezardfu/articl ...

  8. cb50a_c++_STL_算法_局部排序partial_sort

    cb50a_c++_STL_算法_局部排序partial_sort partial_sort(b,se,e)排序一部分,begin,source end,endcout << " ...

  9. POJ 3784.Running Median

    2015-07-16 问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数. 原题链接:http://poj.org/problem?id=3784 解题思路: 求取中 ...

随机推荐

  1. 四川省赛 SCU - 4438

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...

  2. Linux文件系统命令 mkdir/rmdir

    命令名:mkdir 功能:创建一个文件夹,和touch的区别是,touch是创建一个文件,后面可以跟绝对路径和相对路径 eg: mkdir ren 命令名:rmdir 功能:删除一个文件夹

  3. 20165326 java第二周学习笔记

    学习笔记 一.理论学习 基本数据类型与数组 标识符的第一个字符不能是数字:标识符不能为关键字. 基本数据类型多数与c语言相同.重点如下: 1.逻辑类型boolean赋值true/false 2.浮点数 ...

  4. shell脚本实例-mysql多机部署

    今天我给大家分享shell 安装mysql 多机部署的实例,本次实验是基于各个主机的公钥已经配置好了,如果还不会推送公钥的同学,可以看看我以前写的文章,那里面有写推公钥的实例,mysql 多机部署一般 ...

  5. CSS学习笔记之样式规划

    大家都知道规范灵活的代码布局对提升程序员开发和后期维护效率至关重要,因为css同一元素可能被不同偏重度的选择器命中,相同元素不同的选择器表达式的样式冲突导致的显示异常,再加上不规范的代码,经常让前端代 ...

  6. delphi reintroduce作用

    当在子类中重载或者重新声明父类的虚方法时,使用  reintroduce   关键字告知编译器,可以消除警告信息. 如: TParent = class procedure proc;virtual; ...

  7. python生产者消费者模型优点

    生产者消费者模型:解耦,通过队列降低耦合,支持并发,生产者和消费者是两个独立的并发体,他们之间使用缓存区作为桥梁连接,生产者指望里丢数据,就可以生产下一个数据了,消费者从中拿数据,这样就不会阻塞,影响 ...

  8. chrome 总崩溃的正确解决方法

    解决办法: 原因就是 C:\Windows\System32\drivers\bd0001.sys 这个文件 可以把这个文件删除,或者重命名,删除或者重命名后一定要重启电脑,再打开Chrome就OK了 ...

  9. wx小程序入门&坑

    1.腾讯云的nodejs版服务代码,在本地用吹cnpm install安装依赖之后,初始化数据库不成功: 换成npm install 并 npm run initdb 之后 可以了.... 2.屏蔽页 ...

  10. SpringBoot 添加fastjson

    1.先在项目中添加fastjson依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId> ...