> 文章列表 > string的模拟实现

string的模拟实现

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.有关深拷贝与浅拷贝的问题

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

浅拷贝:

 优化为深拷贝:

 


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

有多种情况:

a.两个空间差不多

b.一大一小

c.一小一大

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

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

于是进一步优化为:

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

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

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


3. iterator迭代器的实现

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

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

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


4.string的比较

比较的是ASCII码的大小。

  

 在写代码时,注意复用

例:

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

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

例:

 


5.reserve模拟实现


 

6.push_back和append的模拟实现

 


7.resize的模拟实现

 

 


8.insert的模拟实现

单个字符:

 字符串:

 


 9.erase的模拟实现

 

 


 10.swap的模拟实现


11.find的模拟实现

找某个字符:

找字符串:(复用strstr) 


 12.ostream模拟实现