C++中,string早于STL问世。使用string中的构造函数可以实现对string类型的字符串的一系列操作。
今天来模拟C++中的string的基本结构。注意仅仅是简单模拟,string内部结构其实非常复杂,并且不同版本的IDEstring的内部结构也不尽相同。尽管有所不同,但是各个版本的string实现的效果大致一致。真正的string是大佬团队努力的智慧结晶,而今天只是菜鸟一人自己模拟着玩儿hh
string的增删查改近期也会对其进行简单模拟。
目录
一、初始化
二、模拟c_str
三、模拟size
四、模拟操作符[ ]
五、模拟迭代器iterator
一、初始化
在C++中,string类型的变量,如果不对它进行赋值就初始化,那么它的初始值为空,而不是随机值。那么,要模拟实现string,除了设计有参数的构造函数外,还要设计无参构造函数。
如下,就是设计好了的无参构造函数和带参数的构造函数:
调用下面的函数,调试、运行:
可见,s1和s2均被正常赋值。
当然,上述的两个构造函数,它们是可以合二为一的,像这样:
经调试运行,也是可以得到预期的结果的,这里不再演示了。
记得加上析构函数,用于销毁空间:
二、模拟c_str
众所周知,在C语言当中,字符串是用数组来实现的,而在C++中,既可以用数组也可以用string。那么c_str的作用就是将string的字符串转换成C语言中数组实现的字符串。
详细用法、用例请参照cplusplus.com/reference/string/string/c_str/
现在,要模拟c_str,并不复杂,只需要以下代码即可:
调用下面的函数,得到了预期的结果:
三、模拟size
代码如下:
可以看到,不论是模拟size还是c_str都用了const修饰了函数体。这是因为,这两个函数不需要对类成员进行修改,只读即可,一定程度增强代码健壮性。
四、模拟操作符[ ]
不同于c_str和size,操作符[ ]可读也可写,所以他就需要重载,一个需要用const修饰函数体,一个不需要修饰。
代码如下:
经测试,可得到预期结果:
不仅可以读,还可以写入数据:
五、模拟迭代器iterator
需要先进行定义,typedef char* iterator,然后构造函数begin和end:
调用以下函数,得到了预期的结果:
这是只读版本: