声明:虽然本系列博客与具体的编程语言无关。但是本文作者对c++相对比较熟悉,其次是java,所以难免会有视角上的偏差。举例也大多是和这两门语言相关。

Vector的出现主要是为了解决数组的静态空间的问题。所谓静态空间指的是一旦配置就不能改变。当然如果你硬要重新配置也是可以的,自己重新申请一块空间,然后把数据搬过去。而vector是动态空间,它的内部机制会自行扩充空间以容纳新元素。 可以用水桶装水的例子来示意的感性认识一下。如图1所示,不断向水桶中装水,那么装满了之后怎么办呢。如果是数组的做法,那么就需要自己搬一个更大的桶,把水装进去。而如果是,vector的做法,那么桶就可以自己随着水的增多而变大哦。而且是水刚要满时,水桶就自动变大。C++ vector自动增大至两倍的容量。数组的做法与vector的做法分别如图2和图3。

图1 装水

                                 图2 装水-array

                                                                                                                                                                                 图3 装水-vector
那么问题来了,怎么能实现这种容量自增长呢,或者能够从外部看上去是自增长呢?这时候就体现出面向对象的好处了我们可以构建一个类出来,这个类呢能够帮助我们监测对象的容量,容量不够的时候就自增容量至两倍。这是容易做到的。可以通过一个私有的变量size就可以做到,每次先添加一个元素就增加1。当size与当前的容量一样大的时候就扩容,并将数据拷贝到新的容器中,然后该释放旧空间就释放之类的。因为类的封装,我们看不到这些内容,从外部看上去就实现了这种自增长容量的容器了。但是其原理必定也需要新构造一个空间出来。

图4 vector

接来下介绍两个概念:size,capacity。Begin和end之间的大小就是size,也就是当前的使用容量,可以理解成当前的水位;而capacity是当前所申请的空间大小,可以理解为水桶的容量。那么当size==capacity的时候,就要capacity=capacity*2+1就可以了。当然实际操作起来并不是这么简单,不能把capacity*2+1就不管了,因为capacity也只是一个私有成员变量而已,咱们可不能自欺欺人。要做到实际创建这么大的空间就需要空间分配啊,元素的搬移啊,实操起来还是比较麻烦的。这部分内容可参考《STL源码剖析》4.2小节。另外一个问题是,如果我们不断放水,当水量小到一定程度是,是不是大桶就是一种资源的浪费了呢?对应到程序上来就是空间的浪费。这时候可以换个小桶。那么换多小的桶呢,一个自然的想法是1/2大小的,这样与自增的大小就对应起来了。实际上在某些输入情况下这是会产生性能问题的。比如在数据size 为1/2capacity时不断插入然后删除,那么就会不停的换大桶小桶。在C++ stl中,选用1/4大小。

小秘密:下一篇将讲解C++中的vector以及java中的vector与arrayList。

See you next time. Happy Coding!!!

我的GitHub
---------------------
作者:dnhua
来源:CSDN
原文:https://blog.csdn.net/dnhua/article/details/84797653
版权声明:本文为博主原创文章,转载请附上博文链接!

数据结构与算法(2)- vector概念介绍的更多相关文章

  1. 【学习总结】java数据结构和算法-第一章-内容介绍和授课方式

    总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 几个经典算法面试题 算法和数据结构的重要性 几个经典算法面试题 字符串匹配 暴力法:慢 kmp算法:更 ...

  2. 数据结构与算法——AVL树类的C++实现

    关于AVL树的简单介绍能够參考:数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额外 ...

  3. 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)

    数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...

  4. Java数据结构和算法(一)概念

    Java数据结构和算法(一)概念 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.逻辑结构 数据之间的相互关系称为逻辑结构 ...

  5. 【数据结构&算法】08-栈概念&源码

    目录 前言 栈的定义 定义 常见应用 栈的常见应用 进栈出栈变化形式 栈的抽象数据类型 栈的顺序存储结构及实现 栈的顺序存储结构 顺序栈 顺序栈的结构定义 两栈共享空间 栈的链式存储结构及实现 栈的链 ...

  6. 【转】MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  7. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  8. MySQL索引背后的数据结构及算法原理【转】

    本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...

  9. MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

随机推荐

  1. Android Fragment实现button间的切换

    原文地址:http://blog.csdn.net/a123demi/article/details/32693037 Fragment要点 Fragment是activity的界面中的一部分或一种行 ...

  2. Mysql查看sql是否走事务

    登陆进入server [root@gzmtest_25 ~]# su - mysql [mysql@gzmtest_25 ~]$ mysql.local Welcome to the MySQL mo ...

  3. 【Linux】Ubuntu 开机默认亮度改动方法

    换了ubuntu 之后.发现开机屏幕都是"最大亮度",每次都要到设置中手动调节,非常麻烦.于是想到去改动这个设置.Google一通,别人可行的办法到我这就没用了.郁闷.最后是在st ...

  4. bzoj4950: [Wf2017]Mission Improbable

    跟着靖靖做题%%%%% 这题一看就觉得和之前的某场模拟赛的一道题很像,找假如某行某列的最大值一样的就可以只堆一个,跑匈牙利就行 一开始以为箱子不能移动-_-! 然后有个坑,大家都知道当这个位置有箱子就 ...

  5. 杂项-Java:EL表达式

    ylbtech-杂项-Java:EL表达式 EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提 ...

  6. 洛谷P3047 [USACO12FEB]Nearby Cows(树形dp)

    P3047 [USACO12FEB]附近的牛Nearby Cows 题目描述 Farmer John has noticed that his cows often move between near ...

  7. Websocket实现前后台通信,demo小测试

    新需求大概如下:用户登录系统,登录成功之后建立websocket连接,实现通信 总体思路:前端不是我负责,只是简单的做个功能,先实现登录,把用户标识存入HttpSeesion,再建立websocket ...

  8. mac下idea卡顿问题解决

    idea在加载相对来说比较大的系统时,经常性出现卡顿,就是直接卡死,以至于写起代码特别难受. 最后找到的解决方案是修改idea.vmoptions中的内存大小 执行 find / -name idea ...

  9. Halcon学习笔记之支持向量机(二)

    例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法.通过这个案例,相信大家可 ...

  10. 【java基础】(3)Java继承内存分配

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. (3)子类中定义的成员变量和父类中定义 ...