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. JavaScript如何调用Python后端服务

    本篇文章旨在通过一段JavaScript来演示如何调用python后端服务的,这是我开发的一个构建测试数据的工具. 第一部分:html 代码部分 第二部分:JavaScript代码部分 第三部分:Py ...

  2. Mac下如何连接linux服务器(SSH)-比较好用的SSH工具推荐

    Mac下如何连接linux服务器(SSH) 1.用mac自带终端连接 步骤如下: 打开终端,在顶部shell菜单中选择新建远程连接 在右侧服务器窗口点击+号,添加服务器,输入IP等信息 输入用户名,点 ...

  3. 什么!你想要封装好的ajax

    ajax作为前端开发领域一个必不可少的内容,也是灵魂所在,今天就ajax的封装给大家做一个分析, 如果没有猜错的话现在基本上用原生去写ajax的意见不多了,这是肯定的 ,为什么这么说,jq的ajax大 ...

  4. 栈 & 队列

    栈 先进者后出,后进者先出,LIFO,典型的"栈"结构 从栈的操作特性上来看,栈是一种"操作受限"的线性表,只允许在一段插入和删除数据. 在功能上来说,数组和链 ...

  5. java关键字tranisent用法详解

    作为java中的一个关键字,tranisent用的并不是很多,但是在某些关键场合,却又起着极为重要的作用,因此有必要对它进行一些必要的了解. 一.定义:声明不用序列化的成员域.(源自百度百科) 二.作 ...

  6. 第一章03-Activity的启动模式

    Activity的LaunchMode Android中提供了四中Activity的启动模式 1. standard 2. singleTop 3. singleTask 4. signleInsta ...

  7. ES6优雅的异步操作Promise()

    一.Promise()的基本使用 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. netty集群(一)-服务注册发现

    上篇文章介绍了如何搭建一个单机版本的netty聊天室:https://www.jianshu.com/p/f786c70eeccc. 一.需要解决什么问题: 当连接数超过单机的极限时,需要将netty ...

  9. api请求允许跨域的问题

    让api请求允许跨域 header("Access-Control-Allow-Origin:*");header('Access-Control-Allow-Credential ...

  10. @atcoder - ARC092F@ Two Faced Edges

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出一个有向图,对每条边都做一次询问: 翻转这条边后,对原图的强 ...