数据结构与算法分析笔记(c++)_向量(vector)的实现

3.4向量的实现
在本节中,给出了一个可用的 vector类模板的实现。vector是基本类类型,这意味着不同于C++中的基本数组,vecto可以复制并且其占用的内存可以自动回收(通过其析构函数)。
我们已经讨论了C+基本数组的一些重要特性
数组就是指向一块内存的指针变量:实际的数组的大小必须由程序员单独确定。
内存块可以通过new[]来分配,但是相应地也就必须用 delete[]来释放。
内存块的大小不能改变(但是可以定义一个新的具有更大内存块的数组,并且用原来的数组来将其初始化,然后原来的内存块就可以释放了)。
在这里插入图片描述
第8-9行显示的复制构造函数调用 operator=对已有的 Vector进行复制。
第10~1行的析构函数回收基本数组的内存空间。
最巧妙的例程是第13~26行显示的 operator=。在第15行的混淆检验之后,在第17行释放旧数组,在第21行生成与所复制的 vector同样容量的新数组。在大小被复制后,依次复制数据项。
第28-33行是 resize例程。在对容量进行扩展后,代码简单地设定数据成员 thesize。扩展容量的代价是高昂的,因此,如果容量进行扩展,除非大小也显著增长(大小为0时,使用+1),否则就将容量扩展为大小的两倍,以避免对容量进行再次扩展。
如第35~49行所示,容量的扩展是通过 reserve例程来实现的。该例程具有与 operator[]大部分相同的逻辑:在第42行分配个新数组,在第43和4行复制旧数组的内容,然后在第48行回收旧数组。如第37和38行所示,reserve例程可以用来缩小基本数组。但是,所指定的新的容量必须至少和大小一样大,否则,reserve的请求就被忽略。
在这里插入图片描述

如第50-53行所示,两个版本的。perator门很简单(事实上,与1.7.2节中的 matrix类中operator[]实现非常相似)。通过确定 index是否在0至size()-1的范围内(包括size()-1),错误检测功能可以很容易地实现。如果没在这个范围内就抛出一个异常。
第55~73行是许多小例程的实现,包括:empty、size、capacity、push_back、pop_back和back。在第66行是后缀操作符++,该操作符使用 thesize来索引数组,然后自增 thesize。在讨论迭代器的时候我们见到过相同的习惯用法:itx+使用itr来确定访问哪一项,然后推进itr。
最后,在第75~85行是内置类型的 iterator和 const iterator的声明以及两个 begin方法和两个end方法的声明。这段代码利用了在C+中指针变量具有我们所期望的 iterator应该具有的所有操作符的事实。
因此,在第75~76行,声明 iterator和 const iterator的 typedef语句很简单地就是指针变量的别名,并且 begin和end需要简单地分别返回代表第一个数组位置的内存地址和第一个无效的数组位置。
vector类型的迭代器和指针的相似性意味着使用 vector而不使用C++数组会导致稍高一点的资源消耗。正如所提到的,其缺点是代码没有错误检测。如果迭代器iτ冲出了末端标记的话,艹+itr或
itr都不需要标识错误。解决这个问题需要使 iterator和 const iterator是真正的嵌套类类型而不是简单的指针变量。使用嵌套类类型是很普通的,这也是在35节List类的部分所要讨论的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值