pop_heap(_RAIter,_RAIter,_Compare)
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)的更多相关文章
- C++20初体验——concepts
引子 凡是涉及STL的错误都不堪入目,因为首先STL中有复杂的层次关系,在错误信息中都会暴露出来,其次这么多类和函数的名字大多都是双下划线开头的,一般人看得不习惯. 一个经典的错误是给std::sor ...
- 堆的操作(make_heap,push_heap,pop_heap,sort_heap,is_heap)
堆不是一中sort ranges,堆中的元素不会以递增方式排列,内部以树状形式排列,该结构以每个结点小于等于父节点构成,优先队列就是以堆来实现 make_heap //版本一:用operator &l ...
- STL make_heap push_heap pop_heap sort_heap
make_heap: default (1) template <class RandomAccessIterator> void make_heap (RandomAccessItera ...
- STL--heap概述:make_heap,sort_heap,pop_heap,push_heap
heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制. 而这个实现机制中的max-hea ...
- STL中sort排序算法第三个参数_Compare的实现本质
关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...
- STL源代码剖析——基本算法stl_algobase.h
前言 在STL中.算法是常常被使用的,算法在整个STL中起到很关键的数据.本节介绍的是一些基本算法,包括equal.fill.fill_n,iter_swap.lexicographical_comp ...
- C++ STL源代码学习(map,set内部heap篇)
stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap ...
- stl源码分析之priority queue
前面两篇介绍了gcc4.8的vector和list的源码实现,这是stl最常用了两种序列式容器.除了容器之外,stl还提供了一种借助容器实现特殊操作的组件,谓之适配器,比如stack,queue,pr ...
- STL常用序列容器
这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...
随机推荐
- numpy.distutils.system_info.NotFoundError: no lapack/blas resources found问题解决
操作环境 Python3.6 + Windows7 问题现象 利用pip自动安装seaborn/numpy/scipy(pip install seaborn)模块失败,提示numpy.distu ...
- SSL协议(安全套接层协议)
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输.Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准.其目标是保证 ...
- Structs复习 字符编码问题
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" ...
- JAVA JDK配置
配置环境变量_jdk 1.右键选择[计算机]——[属性] ——[左上角的高级系统设置] 2.点击[环境变量] 3.在[系统变量]里点击[新建], 变量名填写JAVA_HOME,变量值填写JDK的安装路 ...
- Mybatis之mapper.xml配置文件中的#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换.#{}可以有效防止sql注入. #{}可以接收简单类型值或pojo ...
- Vue sync修饰符的使用
父子组件传值,父组件可以给子组件传值,但是子组件是不能修改组件提供的值,这里vue提供了sync修饰符,以前父组件点击子组件显示,子组件关闭按钮,父组件再点击子组件就无法让子组件显示.因为子组件点击关 ...
- SpringMVC点滴(1)
在使用springMVC很久,却一直没有总结其中的一些便捷配置和功能,恰好有空,加以总结 Servlet 3之后,在web.xml中加入async的支持,从而实现异步请求,需要在servlet和fil ...
- weblogic threadpool has stuck threads
https://blog.csdn.net/wyx713510713/article/details/12705221 最近项目启动时出问题,weblogic的nohup日志文件中找到下面一段(红色部 ...
- Django常用的模板标签
django 目前了解的各个文件的作用: manage.py: 运行服务 urls: 路由 views: 处理数据 传递给 html模板 html文件: 通过 {{变量名}}接收变量 通过 模板标 ...
- EM算法之GMM聚类
以下为GMM聚类程序 import pandas as pd import matplotlib.pyplot as plt import numpy as np data=pd.read_csv(' ...