C++中vector和堆的常用使用方法&例题:数据流中的中位数
vector常用函数:
(1)a.size();//返回a中元素的个数;
(2)a.push_back(5);//在a的最后一个向量后插入一个元素,其值为5
(3)a[i]; //返回a的第i个元素,当且仅当a[i]存在
(4)a.empty();//判断a是否为空,空则返回ture,不空则返回false
(5)a.clear();//清空a中的元素
(6)a.back();//返回a的最后一个元素
(7)a.erase(a.begin()+1,a.begin()+3);//删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)
(8)a.insert(a.begin()+1,5);//在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
(9)a.insert(a.begin()+1,3,5);//在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
(10)a.insert(a.begin()+1,b+3,b+6);//b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
(11)a.pop_back();//删除a向量的最后一个元素
(15)a.capacity();//返回a在内存中总共可以容纳的元素个数
添加:vector作为形参时的使用方法
1.fun(vector<int>a) //传值
调用:fun(a)
发生拷贝构造
2.fun(vector<int>&a)//传引用
fun(a)
不发生拷贝构造(改变原有vector)
3.fun(vector<int>*a)//传指针
fun(&a)
不发生拷贝构造(改变原有vector)
2,3区别不知道。。。只是引用指针区别? 知道了再改
堆常用函数:
1.先建立vector<int> nums = {9, 6, 2, 4, 7, 0, 1, 8, 3, 5};
make_heap(nums.begin(), nums.end(), less<int>());(堆首为最大值)
或make_heap(nums.begin(), nums.end(), greater<int>());(堆首为最小值)
2.更新堆(貌似不建立,直接push——heap也行)
nums.push_back(10);
push_heap(nums.begin(), nums.end(), less<int>());
3.删除堆首元素:pop_heap() 注意:先pop_heap(),vector后pop_back():
pop_heap(nums.begin(), nums.end(), less<int>());
nums.pop_back();
原理:堆其实就是把vector内的元素最大值或最小值转移到nums[0]上。而pop_heap()是将nums[0]放到堆尾部,继而调用vector清除队尾
问题:push_heap()并没有传递指针这一类的东西,怎么做到改变vector的?nums.begin()传的可能是地址?
最后附上一道剑指offer题目:数据流中的中位数
void Insert(int num)
{
int k=max.size()+min.size();
//数组进前两个元素
if(k<){
//max.push_back(num);
//前两个不需要建堆
if(k==){
max.push_back(num);
}
if(k==){
if(num>max[]){
int tmp;
tmp=max[];
max[]=num;
min.push_back(tmp);
return;
}
min.push_back(num);
}
}
//自前两个元素开始//保证大堆永远仅比小堆大1或0
//所有元素判断是否比小堆(从大到小3 2 1)min[0]还小,小的话进小堆,通过倾倒机制保证小堆一直比大堆小0或1
//若不比小堆min[0]小,则 进大堆(从小到大4 5 6),大堆有倾倒机制保证大堆一直比小堆大0或1
//倾倒机制:(若大堆元素比小堆大两个则分一个给小堆,或小堆比大堆大时把min[0]放入大堆)
if(k>){
//元素判断是否比小堆(从大到小3 2 1)min[0]还小
if(num<min[]){
//小的话开始处理
min.push_back(num);
int flag=min.size()-max.size();
if(flag>){
//把min[0]拿到max[0]位置上了
max.push_back(min[]);
pop_heap(min.begin(),min.end(),less<int>());
min.pop_back();
push_heap(max.begin(),max.end(),greater<int>());
}
}
//不小则进大堆通过倾倒机制分配
else{
max.push_back(num);
push_heap(max.begin(),max.end(),greater<int>());
int pool=max.size()-min.size();
if(pool>){
//当max数量较min大2时,开始倾倒
min.push_back(max[]);
pop_heap(max.begin(),max.end(),greater<int>());
max.pop_back();
push_heap(min.begin(),min.end(),less<int>());
}
}
return;
}
} double GetMedian()
{
int k1=max.size();
int k2=min.size();
//大堆比小堆多1时。直接返回max[0]
if(k1>k2){
return max[];
}
else{
double avg=(max[]+min[])/2.0;
return avg;
}
}
vector<int>max;
vector<int>min;
内容参考:
1.https://www.jianshu.com/p/13a56502e217
2.https://blog.csdn.net/rxm1989/article/details/39549689
3.https://www.nowcoder.com/ta/coding-interviews?asc=true&order=difficulty
C++中vector和堆的常用使用方法&例题:数据流中的中位数的更多相关文章
- js中关于string的一些常用的方法
最近总结了一些关于string中的常用方法, 其中大部分的方法来自于<JavaScript框架设计>这本书, 如果有更好的方法,或者有关于string的别的常用的方法,希望大家不吝赐教. ...
- 介绍web开发中实现会话跟踪的常用技术方法
由于http是无状态的协议,这种特性严重阻碍了客户端与服务器进行动态交互,例如购物车程序,客户在购物车中添加了商品,服务器如何知道购物车已有的物品呢?为了支持客户端与服务器之间的交互,为了弥补http ...
- js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别
__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性 ...
- C++stl中vector的几种常用构造方法
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #i ...
- C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)
我们实现的数据结构是为了解决在执行过程中动态的开辟空间使用(比如我们不停的输入,输入的多少我们不确定) 假设当你看到这篇文章的话,就当作是零食咀嚼,营养没有有BUG,能够直接看我博客中文章:CPU对内 ...
- Java中正则表达式的使用(常用的方法)
这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...
- 分布式web架构中对session同步的常用处理方法以及优缺点
写在前面 最近在读一本来自淘宝技术团队大牛的书,名字叫<大型网站系统与Java中间件实践>.开篇的章节详细地介绍了一个网站架构由小变大不断演进的过程,其中从单机架构升级到集群架构的过程中着 ...
- js中的BOM和DOM常用事件方法
笔记: window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开 ...
- JavaScript中的window对象的属性和方法;JavaScript中如何选取文档元素
一.window对象的属性和方法 ①setTimeout()方法用来实现一个函数在指定毫秒之后运行,该方法返回一个值,这个值可以传递给clearTimeout()用于取消这个函数的执行. ②setIn ...
随机推荐
- PAT 反转链表
给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...
- iOS-Swift版本自定义CStextView的实现
CSTextView继承自UITextView,并为其增加了placeHolder属性,支持代码和SB方式创建:demo实现了CSTextView的自动排版 效果图 CSTextView地址: htt ...
- Java I/O模型及其底层原理
Java I/O是Java基础之一,在面试中也比较常见,在这里我们尝试通过这篇文章阐述Java I/O的基础概念,帮助大家更好的理解Java I/O. 在刚开始学习Java I/O时,我很迷惑,因为网 ...
- Python--编码转换
# -*- coding:gbk -*- # 即使设置文件编码为gbk,下方定义的字符串s1依旧为unicode # 获取默认编码格式 import sys print(sys.getdefaulte ...
- 03.Java的前世今生
C&C++ 1972年C诞生 ◆贴近硬件,运行极快,效率极高. ◆操作系统,编译器,数据库,网络系统等 ◆指针和内存管理 1982年C++诞生 ◆面向对象 ◆兼容C ◆图形领域.游戏等 背景 ...
- Mybatis一对多或多对多只能查出一条数据解决策略
原文:https://blog.csdn.net/ren814/article/details/81742242 <resultMap id="menuModelMap" t ...
- Android学习笔记ActionView
概念 案例 1.布局文件 activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...
- IntelliJ IDEA中项目import与open的区别
场景: 从原来公司离职来到新的公司,接手公司项目,先将项目从git或svn项目版本管理上clone下来,如果项目原先是用Eclipse开发的,而你更习惯于使用IntelliJ IDEA,下面是针对使用 ...
- Appium 概括与环境安装
Appium 是什么, 有什么用 Appium 用途和特点 appium 是一个移动 app 自动化工具 手机APP自动化有什么用? 自动化完成一些重要性的任务 比如微信客服机器人 爬虫 就是通过自动 ...
- mongodb 数据库 增删改查
mongodb 数据库 增删改查 增: // 引入express 模块 var express = require('express'); // 路由var router = expr ...