string的模拟实现

目录

1.有关深拷贝与浅拷贝的问题

2.运算符重载实现赋值操作(也属于拷贝构造)(A=B)

3. iterator迭代器的实现

4.string的比较

5.reserve模拟实现

6.push_back和append的模拟实现

7.resize的模拟实现

8.insert的模拟实现

 9.erase的模拟实现

 10.swap的模拟实现

11.find的模拟实现

 12.ostream模拟实现


1.有关深拷贝与浅拷贝的问题

浅拷贝指向的是同一块命名空间,所以在析构和修改时会造成不必要的麻烦。

浅拷贝:

string的模拟实现_第1张图片

 优化为深拷贝:

string的模拟实现_第2张图片

 string的模拟实现_第3张图片


2.运算符重载实现赋值操作(也属于拷贝构造)(A=B)

有多种情况:

a.两个空间差不多

b.一大一小

c.一小一大

string的模拟实现_第4张图片

 实现复杂,于是改为直接释放A,另开辟新的空间来存放和B一样的内容。

string的模拟实现_第5张图片

 但是这也有不少问题:比如说s1=s1,已经把s1释放掉了,是会报错的。

于是进一步优化为:

string的模拟实现_第6张图片

 当然,还是会存在问题:没有new成功的话,不仅开空间失败,还破坏了A。

(new失败可以通过抛异常检查)

于是我们进一步修改:(引入char* tmp)

string的模拟实现_第7张图片


3. iterator迭代器的实现

string的模拟实现_第8张图片

(vs下的迭代器并不是以指针的形式实现的)

(范围for的本质也是迭代器,是“傻瓜式”的替代)

const_iterator:const迭代器是可以修改的,是它指向的内容不可以被修改。


4.string的比较

比较的是ASCII码的大小。

  string的模拟实现_第9张图片

 在写代码时,注意复用

例:

string的模拟实现_第10张图片

这里有一个小小的需要注意的地方:

流插入的优先次序更高,所以括号不能少!

例:

string的模拟实现_第11张图片 


5.reserve模拟实现

string的模拟实现_第12张图片


 

6.push_back和append的模拟实现

string的模拟实现_第13张图片

 


7.resize的模拟实现

string的模拟实现_第14张图片

 string的模拟实现_第15张图片

 


8.insert的模拟实现

单个字符:

string的模拟实现_第16张图片

 字符串:

 

string的模拟实现_第17张图片


 9.erase的模拟实现

 string的模拟实现_第18张图片

 


 10.swap的模拟实现

string的模拟实现_第19张图片


11.find的模拟实现

找某个字符:

string的模拟实现_第20张图片

找字符串:(复用strstr) 

string的模拟实现_第21张图片


 12.ostream模拟实现

string的模拟实现_第22张图片 

string的模拟实现_第23张图片 string的模拟实现_第24张图片


你可能感兴趣的:(c++)