目录
一、模拟reserve
二、模拟push_back
三、模拟append
四、模拟operator+=
五、模拟insert
六、模拟erase
七、模拟find
八、模拟substr
一、模拟reserve
要添加数据,首先要考虑的是扩容。有必要用reserve辅助扩容。reserve的作用就是给一个预期的值作为扩容后的大小,如果当前容量比预期的容量要小,就扩容到预期的容量。
二、模拟push_back
push_back顾名思义就是在字符串后插入字符。首先判断字符串长度和当前容量大小,如果字符串长度已经到了容量大小了,就用reserve扩容。之后再在字符串末尾加上终止符\0。
测试结果如下:
三、模拟append
和push_back不同,append是将字符串尾插到当前字符串。值得注意的是,扩容时不能简单地直接扩容到原来的二倍,而是至少扩容到当前字符串长度和尾插的字符串的长度的和。再使用strcpy将新的字符串尾插到当前字符串末尾。
测试一波:
四、模拟operator+=
+=和push_back还有append差别并不大,况且+=的内部就是用push_back和append实现的。只是用起来更方便而已。+=的实现有两种,一种是一个字符,还有一种是字符串,这需要重载实现。
测试:
五、模拟insert
insert也有两种,第一种就是给出要插入的字符、字符个数以及要插入的位置。第二种是给出要插入的字符串以及要插入的位置。需要用重载来实现。
在模拟之前需要在自己的string类和命名空间中定义如下成员:
测试:
六、模拟erase
要擦除n个字符,就需要在erase中提供擦除的起点,以及要擦除的字符数量。首先判断是不是全部删除(即不给len赋值)或者要删除的字符数量和起始位置的和超过了字符串长度,是的话就在合适的位置赋值\0就可以,否则就要挪动字符,然后在末尾赋值\0
测试:
七、模拟find
find可以查找字符,也可以查找字符串,所以就需要重载。值得注意的是,查找字符时,一旦找到就返回下标,而不再查找有没有下一个字符。
测试:
八、模拟substr
substr的作用是找子字符串,给初始位置和子字符串长度后返回找到的子字符串。