make_heap()是生成一个堆,大顶堆或小顶堆

  • make_heap(_RAIter,_RAIter) 默认生成大顶堆
  • make_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(生成小顶堆),一种是less(生成大顶堆)

push_heap()是向堆中插入一个元素,并且使堆的规则依然成立

  • push_heap(_RAIter,_RAIter) 默认为大顶堆
  • push_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(小顶堆),一种是less(大顶堆)
  • 调用push_heap之前必须调用make_heap创建一个堆
  • 首先数组push_back插入元素,然后再调用push_heap,它会使最后一个元素插到合适位置
  • 注意,push_heap中的_Compare和make_heap中的_Compare参数必须是一致的,不然会插入堆失败,最后一个元素还是在最后位置,导致插入失败

pop_heap()是在堆的基础上(即得先构成堆),弹出堆顶元素(还得调用数组pop_back才能完成)。

  • pop_heap(_RAIter,_RAIter) 默认为大顶堆
  • pop_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(小顶堆),一种是less(大顶堆)
  • 比如pop_heap(nums.begin(), nums.end(),greater<int>()),它会将堆顶元素(即为数组第一个位置)和数组最后一个位置对调,然后你可以调用数组pop_back,删除这个元素
  • 注意,pop_heap中的_Compare和make_heap中的_Compare参数必须是一致的,不然会失败

代码示例:

#include <iostream> // std::cout
#include <algorithm> // std::make_heap, std::pop_heap, std::push_heap, std::sort_heap
#include <vector> // std::vector
using namespace std;
class Index {
public:
Index(int a, float b) {
i = a;
cost = b;
}
int i;
float cost;
};

struct greater1 {
bool operator()(const Index& a, const Index& b) const {
std::cout <<"operator ,ai ="<< ' ' <<" acost ="<< ' ' << a.cost<<'\n';
std::cout <<"operator ,bi ="<< ' ' <<" bcost ="<< ' ' << b.cost<<'\n';

return a.cost > b.cost;

}};

struct greater2 {
bool operator()(const Index& a, const Index& b) const {
//return a.cost > b.cost;
std::cout <<"operator ,ai ="<< ' ' <<" acost ="<< ' ' << a.cost<<'\n';
std::cout <<"operator ,bi ="<< ' ' <<" bcost ="<< ' ' << b.cost<<'\n';
}};

int main()
{
int myints[] = {0,1,2,3,4,5,6,7};
std::vector<Index> v;
v.clear();
for(int i=0;i<8;i++)
v.push_back(Index(i, myints[i]));
std::cout <<"start ,size ="<< ' ' << v.size()<<'\n';
for (unsigned i=0; i<v.size(); i++)
std::cout <<i<< ' ' << v[i].cost<< '\n' ;
std::cout << '\n' ;

std::pop_heap(v.begin(), v.end(), greater2());
//std::pop_heap(v.begin(), v.end()); //不重载,编译失败(容器元素是类对象,含有两个成员,需指定)
std::cout <<"pop_heap no grearter "<<'\n';
for (unsigned i=0; i<v.size(); i++)
std::cout <<i<< ' ' << v[i].cost<< '\n' ;
std::cout << '\n' ;

std::pop_heap(v.begin(), v.end(), greater2());
std::cout <<"pop_heap no grearter "<<'\n';
for (unsigned i=0; i<v.size(); i++)
std::cout <<i<< ' ' << v[i].cost<< '\n' ;
std::cout << '\n' ;

std::pop_heap(v.begin(), v.end(), greater2());
std::cout <<"pop_heap no grearter "<<'\n';
for (unsigned i=0; i<v.size(); i++)
std::cout <<i<< ' ' << v[i].cost<< '\n' ;
std::cout << '\n' ;

std::pop_heap(v.begin(), v.end(), greater1());
std::cout <<"pop_heap grearter "<<'\n';
for (unsigned i=0; i<v.size(); i++)
std::cout <<i<< ' ' << v[i].cost<< '\n' ;
std::cout << '\n' ;

std::pop_heap(v.begin(), v.end(), greater1());
std::cout <<"pop_heap grearter "<<'\n';
for (unsigned i=0; i<v.size(); i++)
std::cout <<i<< ' ' << v[i].cost<< '\n' ;
std::cout << '\n' ;
v.pop_back();

std::pop_heap(v.begin(), v.end(), greater1());
std::cout <<"pop_heap grearter "<<'\n';
for (unsigned i=0; i<v.size(); i++)
std::cout <<i<< ' ' << v[i].cost<< '\n' ;
std::cout << '\n' ;

return 0;
}

运行结果:

start ,size = 8
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7 operator ,ai = acost = 2
operator ,bi = bcost = 1
operator ,ai = acost = 4
operator ,bi = bcost = 3
operator ,ai = acost = 3
operator ,bi = bcost = 7
operator ,ai = acost = 1
operator ,bi = bcost = 7
pop_heap no grearter
0 7
1 1
2 2
3 3
4 4
5 5
6 6
7 0 operator ,ai = acost = 2
operator ,bi = bcost = 1
operator ,ai = acost = 4
operator ,bi = bcost = 3
operator ,ai = acost = 3
operator ,bi = bcost = 0
operator ,ai = acost = 1
operator ,bi = bcost = 0
pop_heap no grearter
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7 operator ,ai = acost = 2
operator ,bi = bcost = 1
operator ,ai = acost = 4
operator ,bi = bcost = 3
operator ,ai = acost = 3
operator ,bi = bcost = 7
operator ,ai = acost = 1
operator ,bi = bcost = 7
pop_heap no grearter
0 7
1 1
2 2
3 3
4 4
5 5
6 6
7 0 operator ,ai = acost = 2
operator ,bi = bcost = 1
operator ,ai = acost = 4
operator ,bi = bcost = 3
operator ,ai = acost = 3
operator ,bi = bcost = 0
operator ,ai = acost = 1
operator ,bi = bcost = 0
pop_heap grearter
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7 operator ,ai = acost = 2
operator ,bi = bcost = 1
operator ,ai = acost = 4
operator ,bi = bcost = 3
operator ,ai = acost = 3
operator ,bi = bcost = 7
pop_heap grearter
0 1
1 3
2 2
3 7
4 4
5 5
6 6
7 0 operator ,ai = acost = 2
operator ,bi = bcost = 3
operator ,ai = acost = 5
operator ,bi = bcost = 6
pop_heap grearter
0 2
1 3
2 5
3 7
4 4
5 6
6 1

pop_heap(_RAIter,_RAIter,_Compare)的更多相关文章

  1. C++20初体验——concepts

    引子 凡是涉及STL的错误都不堪入目,因为首先STL中有复杂的层次关系,在错误信息中都会暴露出来,其次这么多类和函数的名字大多都是双下划线开头的,一般人看得不习惯. 一个经典的错误是给std::sor ...

  2. 堆的操作(make_heap,push_heap,pop_heap,sort_heap,is_heap)

    堆不是一中sort ranges,堆中的元素不会以递增方式排列,内部以树状形式排列,该结构以每个结点小于等于父节点构成,优先队列就是以堆来实现 make_heap //版本一:用operator &l ...

  3. STL make_heap push_heap pop_heap sort_heap

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

  4. STL--heap概述:make_heap,sort_heap,pop_heap,push_heap

    heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制. 而这个实现机制中的max-hea ...

  5. STL中sort排序算法第三个参数_Compare的实现本质

    关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...

  6. STL源代码剖析——基本算法stl_algobase.h

    前言 在STL中.算法是常常被使用的,算法在整个STL中起到很关键的数据.本节介绍的是一些基本算法,包括equal.fill.fill_n,iter_swap.lexicographical_comp ...

  7. C++ STL源代码学习(map,set内部heap篇)

    stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap ...

  8. stl源码分析之priority queue

    前面两篇介绍了gcc4.8的vector和list的源码实现,这是stl最常用了两种序列式容器.除了容器之外,stl还提供了一种借助容器实现特殊操作的组件,谓之适配器,比如stack,queue,pr ...

  9. STL常用序列容器

    这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...

随机推荐

  1. mysql 忘记密码解决方案

    Mysql 忘记root密码的完美解决方法 转载  2016-12-23   作者:MR.QiGao    我要评论 通常在使用Mysql数据库时,如果长时间没有登陆,或者由于工作交接完成度不高,会导 ...

  2. 1.Java基础概念.md

    类 •类是Java的最小程序单位,所有程序必须放到类里. •Java中只可以有一个public类,且源文件名称必须和public类名称一致(建议) •Java的main方法: public stati ...

  3. 多线程 死锁 wait(int i) notifyAll()

    public class ThreadDemo5 { public static void main(String[] args){ Pool pool = new Pool(); Productor ...

  4. GIS案例学习笔记-ArcGIS整图大图出图实例教程

    GIS案例学习笔记-ArcGIS整图大图出图实例教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 1. 通过出图比例尺(1:2000),地图范围测算图纸大小. 图 ...

  5. 2019.2.4 nfs原理和安装实验

    NFS 访问一个本地文件还是NFS共享文件对于客户端而言都是透明的,当文件打开的瞬间,内核会作出一个决定,如果是本地文件内核会将本地NFS共享文件内核会将NFS共享文件的所有引用传递给——>NF ...

  6. 移动端调起qq聊天

    <div class="item item-right" style='width:3rem;padding-left:0rem;'>QQ:<a target=& ...

  7. ARM9/ARM11/Cortex A8处理器(转载) .

    //toppic:推荐几个值得中小企业使用的ARM9/ARM11/Cortex A8处理器 // 作者:gooogleman //原文地址:http://blog.csdn.net/goooglema ...

  8. 2018面向对象程序设计(Java)第13周学习指导及要求

    2018面向对象程序设计(Java)第13周学习指导及要求 (2018.11.22-2018.11.25)  学习目标 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的工作机 ...

  9. clone()与image和 cloneTo()

    Mat image = imread("1.png" ) ; Mat image1 ; Mat image1(image) ;//仅是创建了Mat的头部分,image1与image ...

  10. 在Laravel外独立使用laravel-mongodb

    laravel框架外部使用laravel-mongodb 插件 下载安装方式主要根据github上的参考: https://github.com/jenssegers/laravel-mongodb# ...