声明:虽然本系列博客与具体的编程语言无关。但是本文作者对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 LaunchAnyWhere (Google Bug 7699048)漏洞具体解释及防御措施

    開始 近日,Google修复一个组件安全的漏洞LaunchAnyWhere(Google Bug 7699048). 这个漏洞属于Intend Based提取漏洞,攻击者利用这个漏洞,能够突破了应用间 ...

  2. 计算几何 二维凸包问题 Andrew算法

    凸包:把给定点包围在内部的.面积最小的凸多边形. Andrew算法是Graham算法的变种,速度更快稳定性也更好. 首先把全部点排序.依照第一keywordx第二keywordy从小到大排序,删除反复 ...

  3. Java 二进制和十进制互转,二进制和BitSet互转

    /** * 二进制转十进制 * * @param binaryNumber * @return */ public static int binaryToDecimal(int binaryNumbe ...

  4. luogu3469 [POI2008]BLO_Blockade

    题目大意 给一个无向连通图,求对于每一个点,去掉该点后图中连通结点有序对的减少量. 思路 当时想这道题时,我想到:枚举每一个点,在删去它后连通的几个部分中Dfs得到各个部分的点的个数从而得到解,但是我 ...

  5. Linux下使用popen()执行shell命令【转】

    本文转载自:https://my.oschina.net/u/727148/blog/262987 函数原型: #include “stdio.h” FILE popen( const char co ...

  6. 如何注释ascx中的代码

    https://forums.asp.net/t/1783252.aspx?Commented+out+ascx+code+not+treated+as+commented+out+ <%--  ...

  7. Beauty Contest(凸包求最远点)

    http://poj.org/problem?id=2187 题意:求凸包上最远点距离的平方 思路:开始用旋转卡壳求的最远点,WA,改了好久..后来又改成枚举凸包上的点..AC了.. #include ...

  8. 昂贵的聘礼(Dijkstra)

    http://poj.org/problem?id=1062 每个物品看成一个节点,酋长的允诺也看作一个物品, 如果一个物品加上金币可以交换另一个物品,则这两个节点之间有边,权值为金币数,求第一个节点 ...

  9. hdu5673-Robot

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=5673 好久没打BC,当时这场过了3题,hack了一个,马马虎虎吧,因为前三个题确实不难. 这个是那场的第 ...

  10. 8.19noip模拟题

      2017 8.19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas ...