前言
在我们学习的时候总是会用到string,知道它具备各种功能,它也是一种很强大的模板,那么有没有想过,我们天天都在使用的它,它的底层又是怎么样的,它又是如何实现的呢。这里讲挑选几个比较常用的一个功能来作以讲解。
迭代器iterator
想必迭代器大家一定不陌生把,它也是string里面比较重要的一块功能了。那么我们在写它的时候看起来它是不是很厉害,给他一个起始位置,终止位置他就能把string对象中的对象全取出来,其实看起来越华丽的东西它的低沉就是多基础,如果我们要自己去实现它的话,其实iterator就是一个char*,把这个指针指向string对象的起始位置,遍历这个对象,当遇到最后一个位置end的时候就停止了。
修改容量大小reserve()
初看这个函数以为这个是一个逆序字符串的函数,其实不然,他和reverse完全不相干,只是两个兄弟长得比较像而已。当我们在觉得空间不够的时候,可以轻轻松松的使用它来给自己开辟一块空间,可总是使用它也不能只处于认识它的地步吧,好朋友总是知根知底的。其实实现起来它就是同样的很简单
先来看看它的原型
它的意思大概就是说我们需要传入一个n来表示需要改变的容量,如果这个n大于当前容量,就会将容量阔到n的位置,在其他情况下容器可以自行优化,那么这里我先只考虑n大于当前容量。既然这样我们就可以直接开辟一个临时指针(空间开到n)来存放当前原字符串中的内容,然后去释放掉原字符串的空间,再把临时的指针赋给原指向字符串的指针,这样就实现了我们对空间的扩容了。
改变有效字符大小resize
上面是修改我们的容量空间大小,既然容量能修改了,那么有效字符的大小自然也要配套了。
那么什么是有效字符呢,就是在对象中实际的字符串长度、
我们先去看一下它的原型
它的大概意思就是说将字符串调整为n的大小,如果n小于当前字符,就将n后面的值抛掉,如果n大于当前容量就在后面添加字符c,如果指定了字符则初始化为c,如果没有指定就初始化成空字符。那么我们在实现的时候也要考虑到两种情况,一种就是n比size小,一种是n比size大但是比总容量小,还有一种就是n比size大并且比总容量也要大。
首先看第一种,n比size小很好实现,我们不必真的去删除后面的字符,直接可以在n的地方放一个字符0来表示结束就行,那么第二种情况和第三种情况我们都可以并为一种,无论是比总容量大还是比总容量小,我们都直接释放掉当前指针指向的那块空间,然后去新开一一块大小为n+的空间,把新的空间给到原来的空间。