数据结构与算法(2)- vector概念介绍
声明:虽然本系列博客与具体的编程语言无关。但是本文作者对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概念介绍的更多相关文章
- 【学习总结】java数据结构和算法-第一章-内容介绍和授课方式
总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 几个经典算法面试题 算法和数据结构的重要性 几个经典算法面试题 字符串匹配 暴力法:慢 kmp算法:更 ...
- 数据结构与算法——AVL树类的C++实现
关于AVL树的简单介绍能够參考:数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额外 ...
- 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)
数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...
- Java数据结构和算法(一)概念
Java数据结构和算法(一)概念 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.逻辑结构 数据之间的相互关系称为逻辑结构 ...
- 【数据结构&算法】08-栈概念&源码
目录 前言 栈的定义 定义 常见应用 栈的常见应用 进栈出栈变化形式 栈的抽象数据类型 栈的顺序存储结构及实现 栈的顺序存储结构 顺序栈 顺序栈的结构定义 两栈共享空间 栈的链式存储结构及实现 栈的链 ...
- 【转】MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- [转]MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- MySQL索引背后的数据结构及算法原理【转】
本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...
- MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
随机推荐
- @Repository @Service 和@Autowired 的使用
解释: @Controller 声明Action组件 @Service 声明Service组件 @Service("myMovieLister") @Repositor ...
- RedisUtil: Jedis连接自动释放
package cloud.app.prod.home.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.Jedi ...
- HDU5489 LIS变形
Removed Interval Problem Description Given a sequence of numbers A=a1,a2,…,aN , a subsequence b1,b2, ...
- Linux C语言头文件搜索路径
本文介绍在linux中头文件的搜索路径,也就是说你通过include指定的头文件,linux下的gcc编译器它是怎么找到它的呢.在此之前,先了解一个基本概念. 头文件是一种文本文件,使用文本编辑器将代 ...
- hdu 6082 度度熊与邪恶大魔王(2017"百度之星"程序设计大赛 - 资格赛 )
度度熊与邪恶大魔王 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- poj 2142
Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. F ...
- poj--3187--Backward Digit Sums(dfs)
Backward Digit Sums Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5667 Accepted: 32 ...
- P2831 愤怒的小鸟 状压dp
这个题主要是预处理比较复杂,先枚举打每只鸟用的抛物线,然后找是否有一个抛物线经过两只鸟,然后就没了. 题干: 题目描述 Kiana 最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上 ...
- ASP.NET的Eval方法和Bind方法的区别
Eval是只读的方法(单向数据在邦定),所邦定的内容为不会提交回服务器. 比如图书的ISBN,并不想让用户做任何修改,可以使用<%# Eval('ISBN').TOString().Trim() ...
- MVC异步上传图片到本地/服务器
这两天朋友问我,有没有异步上传图片到本地/服务器这种demo,他有用, 我就想,好吧, 那刚好周末了,整理一套出来. 主要用到的是jquery uploadify 这个juqery的插件 ,可以无刷新 ...