My C++之再谈顺序容器

 

本来这篇文章是想昨天晚上把它写好的,由于昨日武汉凉爽万分,本以为腰好多了滴我还是捡起来篮球走向球场。不幸的是又扭伤了腰,疼痛之中就没心情再写了,知道现在还疼着呢,哎、、、这伤不起的腰啊,就等着开学做理疗吧。不博取同情了,咱进入主题、、、

     上一篇文章写到的是顺序容器,其实后来我把关联容器也看了,但是我的心一直纠结着,我认为现在对容器已经有了一定的认识,至少可以运用了(技巧谈不上)。但是我对容器的好奇心总是挂在那里,我还有好多疑问在那里,比如说上次已经讲了容器就是类模板,而迭代器就是类模板里面的一员,不清楚容器的设计,当然就不清楚迭代器的设计。为什么要有迭代器?为什么不直接用指针呢?其实迭代器就是所谓的智能指针,为什么这么说?因为它根据容器的设计模仿了指针的相关操作,说白了,就是重载了operator*、operator->、operator++、operator—等操作。而且你还不用担心内存漏洞的问题,因为它里面的成员函数帮你实现了内存释放的问题。而且关键的是,有了它,你就完全看不见容器内部的设计和函数实现细节,使用者使用起来当然就得心应手、方便自如。理所当然,每种容器都有自己专属的容器,因为最懂容器内部构造的人才能设计出最优的迭代器。

古语有云,天下大事,必作于细。如果只单纯停留在运用的表面,而对内部不闻不问,则会造成利器在手而不能善用的结局。本来就打算等看完面向对象程序设计再来好好看看这泛型编程然后再是STL,但只是非常的好奇,所以还是打开了vector头文件,看看里面的究竟。话说这个头文件里面有2481行代码,所以这里也只谈谈自己所看到的,只是片面的而已…..

上面已经说了迭代器是vector类模板的一员,是什么呢?也是一个类模板,不多说,

上源码、、、


本来这篇文章是想昨天晚上把它写好的,由于昨日武汉凉爽万分,本以为腰好多了滴我还是捡起来篮球走向球场。不幸的是又扭伤了腰,疼痛之中就没心情再写了,知道现在还疼着呢,哎、、、这伤不起的腰啊,就等着开学做理疗吧。不博取同情了,咱进入主题、、、

     上一篇文章写到的是顺序容器,其实后来我把关联容器也看了,但是我的心一直纠结着,我认为现在对容器已经有了一定的认识,至少可以运用了(技巧谈不上)。但是我对容器的好奇心总是挂在那里,我还有好多疑问在那里,比如说上次已经讲了容器就是类模板,而迭代器就是类模板里面的一员,不清楚容器的设计,当然就不清楚迭代器的设计。为什么要有迭代器?为什么不直接用指针呢?其实迭代器就是所谓的智能指针,为什么这么说?因为它根据容器的设计模仿了指针的相关操作,说白了,就是重载了operator*、operator->、operator++、operator—等操作。而且你还不用担心内存漏洞的问题,因为它里面的成员函数帮你实现了内存释放的问题。而且关键的是,有了它,你就完全看不见容器内部的设计和函数实现细节,使用者使用起来当然就得心应手、方便自如。理所当然,每种容器都有自己专属的容器,因为最懂容器内部构造的人才能设计出最优的迭代器。

古语有云,天下大事,必作于细。如果只单纯停留在运用的表面,而对内部不闻不问,则会造成利器在手而不能善用的结局。本来就打算等看完面向对象程序设计再来好好看看这泛型编程然后再是STL,但只是非常的好奇,所以还是打开了vector头文件,看看里面的究竟。话说这个头文件里面有2481行代码,所以这里也只谈谈自己所看到的,只是片面的而已…..

上面已经说了迭代器是vector类模板的一员,是什么呢?也是一个类模板,不多说,

上源码、、、


可以看出来,在vector类模板中定义了四种迭代器,当然这四种迭代器模板的定义在源码的另一处,也不用贴出来了,里面无非也就是一些迭代器相应型别的定义,和一些模仿指针操作的函数,然后就是其他一些功能函数,所以就通了,原来我还纳闷着迭代器到底是什么类型,其实它也就是指针的封装,就好比奶茶,本质还是水做的,只是往里面添加了奶精等添加剂一样,味道是变了,但同样还流露出了一些水的特性(解渴)。

上次同样介绍过顺序容器类似数组也是一种数据结构,不过是复杂了一些而已,当然复杂留给了设计者,方便了程序员们。上篇文章已经说了,如果一种数据结构能被广泛使用,必定是因为它的高效和便利性,然而,顺序容器如何保证了它的高效性?顺序容器中最长用的应该属vector,我们都知道,vector和数组的不同之处主要在于容器的大小是“智能的”,也就是说,我们不必担心它的大小问题,然和它肯定会有个饱满值,即便是暂时的,要不然开大了空间则浪费了内存。但是如果每当容器达到满载时就扩充空间,那必然会严重影响容器的效率,所以英明的设计者采用了设置备用空间的策略,所以迭代器的end并不是容器真正的尾部,真正的尾部迭代器永远都大于或等于end。所以只有当容器达到真正满载的时候才会扩大容器的容量,当然,这种扩大并不是单纯在原容器后面添加空闲空间,哪有那么简单!谁知道后面的空间是不是空闲的啊,因为vector是线性连续的嘛…所以必须重新申请一段更大的空间,然后将原容器里面的元素往新容器里面拷贝,然后再在后面添加新元素。这样就保证了内存的利用率和容器的效率。

当然,顺序容器本身远不止上述这样,还有更多体现设计者巧妙思维的地方,只不过咱得一步一步来,是必要打好基础后才能去底层探险,要不然等着被淹、、、呵呵

        天下大事,必作于细_____

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值