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. [ SHELL编程 ] 远程服务器传输文件

    在shell编程中经常需要获取远程服务器文件.手工操作中使用scp命令完成.为避免脚本执行scp输入密码进行交互,需先建立本机服务器当前用户和远程服务器指定用户的信任关系.具体代码见操作实例,重点关注 ...

  2. Linux通配符与基础正则表达式、扩展正则表达式

    在Linux命令行操作或者SHELL编程中总是容易混淆一些特殊字符的使用,比如元字符‘*’号,作为通配符匹配文件名时表示0个到无穷多个任意字符.而作为正则表达式匹配字符串时,表示重复0个到无穷多个的前 ...

  3. Delphi编写Shell扩展

    用delphi创建一个外壳扩展(Shell Extension)程序的基本步骤如下: (1) 创建一个 ActiveX Library 工程,命名为“CloudUpload“(2) 创建一个新的自动化 ...

  4. 为tomcat配置项目必须的引擎文件

    1.如下图所示,红框圈出来的四个语音引擎文件是直接放在项目根目录下的,这样的话我们发布web应用的时候,项目并不能自动把这几个文件打包到tomcat中, 除非放到WebRoot文件夹下,但是这样的话项 ...

  5. 吴裕雄 14-MySQL DELETE 语句

    以下是 SQL DELETE 语句从 MySQL 数据表中删除数据的通用语法:DELETE FROM table_name [WHERE Clause]如果没有指定 WHERE 子句,MySQL 表中 ...

  6. ubuntu下安装nodejs和npm

    第一种安装方法: 安装nodejs : 1 sudo apt-get install nodejs 运行 nodejs -v 会弹出安装node的版本号 这里使用的是 nodejs 并不是常用的nod ...

  7. 2.5、CDH 搭建Hadoop在安装(设置Cloudera Manager数据库)

    步骤5:设置Cloudera Manager数据库 Cloudera Manager Server包含一个可以为自己创建和配置数据库的脚本.该脚本可以: 创建Cloudera Manager Serv ...

  8. Manifest File

    [Manifest File] on every build, webpack generates some webpack runtime code, which helps webpack do ...

  9. Avalon Framework

    Apache Avalon has closed. Apache Avalon began in 1999 as the Java Apache Server Framework and in lat ...

  10. GsonFormat的使用 (转)

    一.Android Studio快速添加Gson 具体操作:        1.File->Project Structure:   2.app->Dependencies->&qu ...