1.构造和销毁
(1)这个地方我们自己进行这个初始化,以及使用之后的这个销毁的过程,我们在这个构造函数里面给了str默认的缺省参数,使用初始化列表的方式对里面的部分成员变量进行初始化,我们可以让这个初始化列表和动态开辟混合使用,使用方法如下:
(2)capacity的大小始终是比这个size多一个的,这个就是为了斜杠0留足够的空间 ,使用这个new进行动态开辟空间,使用delete销毁空间,c_str这个函数就是为了打印我们的测试内容,其中这个里面的strcpy进行拷贝的时候是把这个斜杠0也会拷贝过去的;
2.遍历的三种方式
(1)迭代器,循环,范围for
第一种就是最直接的通过循环的方式进行遍历,第二种就是迭代器的方式,第三种就是通过范围for的方式,其实这个范围for的本质就是这个迭代器,迭代器在大部分的情况下面就是一个指针变量,实际上这个通过范围for进行打印就是转换为迭代器进行打印的;
(2)通过下面这个例子我们就可以发现,这个范围for实际上不会对于这个str1进行实质上的修改,但是这个迭代器就是指针,是可以对我们定义的字符串进行修改的;
3.尾部插入数据
(1)reserve函数
我们扩容的时候传参的是一个数字,在这个函数里面我们首先就要开空间,大小就是比参数大一,这个就是类似于c语言里面的realloc函数的用法,把这个数组位置的数据挪到temp这个动态开辟的空间上面,再释放掉原来的空间,这个时候再把temp拷贝回去,最后不要忘记把这个_capacity的数值进行更新,就是我们的新空间的大小;
(2)pushback函数
这个函数主要是在这个末尾插入字符的,这个里面就是用了reserve函数进行扩容的,判断条件里面的size==capacity说明这个时候的元素个数正好等于空间的大小,这个时候我们才需要进行扩容
扩容的时候,就是把这个新的字符进行尾插入,再让这个size加加,最后在这个末尾添加斜杠0,我们这个时候需要注意的是,如果我们在定义的时候进行初始化的情况下,这样做是可以的,但是如果本来就是空的,size==capacity=0这个时候进行二倍扩容之后还是0,这个时候再进行数据的插入就越界了,所以我们可以使用这个三目运算符判断这个字符串是否为空,空的话我们就开辟4字节大小的空间;
(3)append函数
这个函数针对字符串进行尾插入,我们首先还是要进行判断这个字符串插入之后空间是否足够,超过空间大小的话我们就应该进行扩容了,大小就是这个size+len的字节大小,然后再把这个形参str从_str+_size的位置开始进行拷贝,最后使用重载运算符进行size的更新;
(4)运算符重载
下面的这个就是对于+=运算符的重载,我们在尾插入字符串更新size的时候就是用了这个运算符;
我们下面设置了两个,一个是对于单个字符的,一个是针对于字符串的进行使用的
下面的这个就是中括号访问操作符,我们也是设计了两个,一个的作用是只读不写,还有一个就是可以进行修改的,这样的针对性就会更强;
(5)npos设置
我们知道这个在删除数据的时候,我们只需要给一个参数,这个编译器就会默认删除到底,所以我们要自己先声明定义一下npos这个变量;
静态成员变量,先进行声明,在这个类的外面进行初始化的操作,这个地方是一个特例,我们可以直接在这个类里面进行初始化,而且是可以运行的;
因为这个我们之前介绍的是,声明的时候给的值是缺省值,走的是初始化列表,但是这个静态成员变量不会走初始化列表的,所以我们应该是先在类的里面进行声明,在类的外面进行初始化,但是这个地方相当于是给int类型的静态成员变量开了一个口子,我们只需要了解这样是可以编译通过的即可,我们平常还是在类里面进行声明,外面进行定义;
(6)insert函数
这个函数就是用来在这个字符串里面的任意位置插入数据的,我们简单的逻辑如下,就是要一个一个的挪动数据;
这个时候我们在中间位置插入,在尾部插入,都不会报错,但是在这个头部插入就会报错;
原因就是在这个头部进行插入,我们传递的pos=0,再循环里面end>=pos就会一直进行循环体的执行,pos=0只有end=-1的时候才会跳出循环,但是end在这里是size_t类型的,肯定不会到-1的
我们下面提供两种方法解决这个问题:
方法1:
第一种就是进行强制类型转换,不让他进行整形提升;
方法2:
改变这个end指针指向的位置,不让这个判断条件的位置取等号这样的话end=1的时候减减就变成了0,0>0不满足跳出循环这个时候就解决了问题;
(7)其他运算符重载
我们先搞一下<和==其他的都是用这两个进行实现;
(8)流插入和流提取
这个就是流插入的实现,我们可以使用循环,但是也可以使用范围for,范围for的话这个参数是const类型的,我们需要添加const迭代器,添加过程如下,带const就是const迭代器,否则就是普通的迭代器;
流提取的重载:
初始版本就如同上面展示的那样,但是编译器不会通过,因为这个cin不会捕捉到斜杠0,这个时候就算我们有斜杠0和空格,这个也不会停止循环的,所以这个时候我们就要使用get函数进行字符的读取;
因为在这个cin重载里面,我们使用的是+=运算符,所以我们需要进行这个清空的操作,因此这个时候我们需要搞一个clear函数出来,不然的话,这个就会在原来的基础上面去尾插字符串,不符合我们的要求,clear函数的设计也是很简单的,就是把这个数组的第一个元素修改为斜杠0,size改为0即可。