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和堆的常用使用方法&例题:数据流中的中位数的更多相关文章

  1. js中关于string的一些常用的方法

    最近总结了一些关于string中的常用方法, 其中大部分的方法来自于<JavaScript框架设计>这本书, 如果有更好的方法,或者有关于string的别的常用的方法,希望大家不吝赐教. ...

  2. 介绍web开发中实现会话跟踪的常用技术方法

    由于http是无状态的协议,这种特性严重阻碍了客户端与服务器进行动态交互,例如购物车程序,客户在购物车中添加了商品,服务器如何知道购物车已有的物品呢?为了支持客户端与服务器之间的交互,为了弥补http ...

  3. js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别

    __proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性 ...

  4. C++stl中vector的几种常用构造方法

    #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #i ...

  5. C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)

    我们实现的数据结构是为了解决在执行过程中动态的开辟空间使用(比如我们不停的输入,输入的多少我们不确定) 假设当你看到这篇文章的话,就当作是零食咀嚼,营养没有有BUG,能够直接看我博客中文章:CPU对内 ...

  6. Java中正则表达式的使用(常用的方法)

    这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...

  7. 分布式web架构中对session同步的常用处理方法以及优缺点

    写在前面 最近在读一本来自淘宝技术团队大牛的书,名字叫<大型网站系统与Java中间件实践>.开篇的章节详细地介绍了一个网站架构由小变大不断演进的过程,其中从单机架构升级到集群架构的过程中着 ...

  8. js中的BOM和DOM常用事件方法

    笔记: window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开 ...

  9. JavaScript中的window对象的属性和方法;JavaScript中如何选取文档元素

    一.window对象的属性和方法 ①setTimeout()方法用来实现一个函数在指定毫秒之后运行,该方法返回一个值,这个值可以传递给clearTimeout()用于取消这个函数的执行. ②setIn ...

随机推荐

  1. PAT 人口普查

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的,假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...

  2. 从程序员到项目主管再到项目总监,一个IT从业者三个职业生涯阶段的工作生活日常

    这是王不留的第 8 篇原创文章 前段时间写过<王不留的十多年工作和生活的流水帐>,在知乎.简书,还有不少微信的朋友私信问我每天四点钟是如何做到的?你现在的作息时间是怎么安排的? 于是,我将 ...

  3. 【深度思考】JDK8中日期类型该如何使用?

    在JDK8之前,处理日期时间,我们主要使用3个类,Date.SimpleDateFormat和Calendar. 这3个类在使用时都或多或少的存在一些问题,比如SimpleDateFormat不是线程 ...

  4. 基于ABP做一个简单的系统——实战篇:2.代码生成器

    上一篇正说着呢,代码生成器就来了. 1.适用于ABP官网的Startup Template V3.x的包含了登录.用户等页面的MPA应用模板2.当前view仅支持文本框生成,远期规划根据字段类型生成不 ...

  5. 青蛙的约会 (ax+by=c求最小整数解)【拓展欧几里得】

                                                  青蛙的约会(点击跳转) 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住 ...

  6. 循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

    在我们做应用系统的时候,往往都会涉及图表的展示,综合的图表展示能够给客户带来视觉的享受和数据直观体验,同时也是增强客户认同感的举措之一.基于图表的处理,我们一般往往都是利用对应第三方的图表组件,然后在 ...

  7. 记一次Idea+Gradle编译Spring源码遇到的坑

    打算开始研究Spring源码,于是照着书上的指导从网上下载了Spring5.0.2版本和Gradle4.0(必须JDK1.8.60以上),本地编译的时候没有任何问题,就是导入Idea的时候一直报下面这 ...

  8. 一文梳理JavaScript 事件循环(Event Loop)

    事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑. 众所周知,JS是单线程的,即同一时间只能运行一个任务.一般情况下这不会引发问题,但是如果我们有一个 ...

  9. #PHP 类的多继承实现之 traits.md

    TRAIT PHP本身是并不支持多继承的,也就是,一个类只能继承一个类,为了满足业务需求,后来有了一些解决方法,例如,链式继承,B继承A,然后C继承B,这样,C就同时继承了AB, 此外还有接口,因为接 ...

  10. 一分钟开始持续集成之旅系列之:C 语言 + Makefile

    作者:CODING - 朱增辉 前言 make 工具非常强大,配合 makefile 文件可以实现软件的自动化构建,但是执行 make 命令依然需要经历手动输入执行.等待编译完成.将目标文件转移到合适 ...