大家好
欢迎回来继续学习
C++语言程序设计
这一节呢
我们来学习使用vector
vector是什么呢
是C++标准模板库
里面的一个类模板
它的作用是什么呢
为什么我们需要使用vector
vector其实
就像一个数组一样好用
但是
它比我们自己定义的数组
使用起来更加安全
更加方便
记得在前面我们讲过一个例题
那个例题封装了一个动态数组
在类里面
为什么我们要把动态数组
封装到类里面去呢
就是因为
每次我们使用动态数组的时候
都要用new去分配空间
然后用delete删除
这样的话呢
如果说你配合的delete删除
不能够及时
或者忘了删除
还会造成内存空间泄漏等等
既不方便 又不安全
那么将这样的动态数组
封装到类里面
把内存空间分配和释放
都在类里面定义好了
以后呢
使用的时候你只要用就行了
这样就更安全 更方便
但是也有个问题
我们自己封装的这个动态数组
大家还记得吧
它就只能用来容纳
point类型的数据
可是我们程序中
还存在着大量其他类型的数据
是不是我们要为
每一种类型的数据
都去定义一个
封装动态数组的类呢
那也太麻烦 太辛苦了吧
实际上呢
类模板里面的这个
vector类模板
就起到这样的作用
它可以用来容纳
任何类型的数组
只要在每次你使用vector
去构造一个新数组的时候
去构造一个新对象的时候
你告诉它
这一次我要容纳的数组
元素是什么类型
就可以了
那么我们一般数组
所能够进行的操作
这些功能它都有
而且呢
自动地分配内存空间
自动地删除
还能进行下标越界检查
确实是非常好用的
下面我们就来看
到底如何去定义
一个vector对象
我们看在定义
一个vector对象的时候
其实很简单
因为它是类模板
关于类模板
我们会在第九章
作详细介绍
但是现在呢
我先简单地给大家说一下
它大致的意思就是说
vector可以容纳任何类型的数组
那么这一次
我们想容纳什么类型
就在这个尖括号里
把类型名写在这儿
那么就相当于定制了一个
我们需要类型的这样一个数组类
然后构造这个类的对象
其实就是非常好用的
这样定义了vector对象以后
我们要使用的时候
就可以当普通数组一样用
就拿这个对象名当数组名用
所以可以用vector对象名
方括号下标的方式
去访问每一个元素
那么它比数组更方便的地方
还在于
它有一个size函数
可以自己返回数组的长度
也就是数组元素个数
这样的话
如果我们传送一个vector对象
给函数的话
我们就不用说
我们还要传送一个数组的长度了
它自己就可以计算出长度了
所以比用数组更方便
下面的例题就演示了
vector对象的用法
现在我们看呢
这是定义了一个
vector类模板的
double实例的这样一个对象
什么意思呢
vector
是标准库里面的一个类模板
我们前面
自己封装的一个动态数组类
它只能适用于存放点类的对象
那它不够通用
而vector是一个
相对非常通用的这么一个模板
你希望它
容纳什么类型的元素的数组
你就在后面注明这个类型就行了
然后它就生成这么一个类
所以vector是一个模板
给它指定了模板参数是double
它就实例化生成了一个类
这个类就专门用来存放
double类型的元素
所以现在我们定义了
这样一个对象arr
它呢是
这个对象呢
实际上它是一个
内嵌了一个数组
这个数组有n个元素
所以我们就可以像
访问普通数组一样
用数组名下标的方式
去访问它的每一个元素
为什么它就可以用下标
为什么
我自己封装的动态数组类
就不能用下标呢
在第八章
我们会讲运算符重载
实际上在vector里面
是重载了下标运算符的
所以才可以用
我们学过以后呢
我们自己也会在第九章
写一个类似的数据结构
我们自己来重载下标运算符
希望大家在第八章
在第九章中能够学会这一点
现在就知道
它可以像数组一样用
用数组名下标的方式去访问
很容易
还有呢
接下来我们要调一个
求平均值的函数
去求这个数组里面的
数据的平均值
这样的话呢
我们觉得怎么只传了一个对象
虽然它可以当数组名用
但是数组元素的个数没传过去
这个函数能知道怎么求平均值吗
我们看一下
在这里呢
确实只接受了一个对象引用
不知道它这里面的元素个数
但是for循环的时候
我们可以去调用这个size
也就是说
在vector对象里面
有一个很有用的size函数
它可以返回里面的元素个数
所以用这个
就可以控制循环了
这样我们就求了平均值
将结果返回
大家看这个vector
是不是很好用呢
下面我们来看一个
通过基于范围的for循环
配合auto类型
来遍历vector的例子
现在我们再看
用一个更方便的方法
用这个基于范围的for循环
来配合这种自动类型
遍历这个vector容器里面的数据
大家看
我们现在构造的这么一个对象v
里面容纳的是整数
int类型的数组
并且给它了初始值有三个元素
1 2 3
好 接下来我们要遍历这个数组
怎么遍历呢
我们也不用去计算
它的size
它有多少个元素了
直接就去调用对象v的begin函数
得到它的起始指针
这个指针呢
是个打引号的指针
是我们在第十章会给大家讲
类库里面的
stl库里面这个范型的类模板
范型的算法这些
所以我们暂时把它理解成
像指针一样
实际上它是一个迭代器
算它是面向对象的指针吧
它的起始
指向它的起始位置的这么
一个指针
控制它结束呢
是达到
指向它结束位置的这么个指针
每一轮循环呢
这个指针加1指向下一个元素
那么
这到底是个什么类型的指针呢
自动类型
大家看这自动类型到这儿
有用了吧
你给它的是什么类型
指针它就接受什么类型
随着这个初始值来定类型
这样就非常方便了
另外呢
我们再看
如果我们要是去遍历
全部的元素的话
我们还可以用这样的方式
就是用基于范围的for循环
每次这个e这个变量
都会从v这个对象中
依次取出一个数组元素来
进行处理
至于说取出的是什么类型的元素
e应该定义成什么类型
这个都不用管
给一个auto自动类型就行了
v里面的元素是什么类型
这个e就会随着定义成什么类型