【C++】——string模拟实现
前言
string的模拟实现其实就是增删改查,只不过加入了类的概念。
为了防止与std里面的string冲突,所以这里统一用String。
目录
前言
一 初始化和销毁
1.1 构造函数
1.2 析构函数
二 迭代器实现
三 容量大小及操作
四 运算符重载
4.1 bool operator=(const String& s) const
4.6 bool operator!=(const String& s) const
五 字符串操作
5.1 截取操作
5.2 查找操作
六 流插入流提取
6.1 ostream& operator(istream& in, String& s)
七 string与string相加
String operator+(const String& s2)
string类模拟实现完整代码
总结
一 初始化和销毁
1.1 构造函数
对于构造函数来说有有参构造和无参构造
所以直接把他们结合起来
default | string(); |
---|---|
copy | string (const string& str); |
1.string();//无参构造
2.string (const string& str);//有参构造
String(const char* str = "") :_size(strlen(str)), _capacity(_size) { _str = new char[_capacity+1]; strcpy(_str, str); }
如果把_str的初始化放在初始化列表会出问题
private: char* _str; size_t _size; size_t _capacity; static const size_t npos = -1;
String(const char* str = "") :_str(new char [_capacity+1]),_size(strlen(str)), _capacity(_size) { //_str = new char[_capacity+1]; strcpy(_str, str); }
初始化列表是会按照成员变量的顺序去初始化,所以这里 初始化_str,_capacity没有初始化,所以在开空间的时候会出问题,当然你可以换一换位置,但是未免太繁琐,同时这里不能把_str设置为nullptr,如果设置为空,那么_size正初始化就会出问题
1.2 析构函数
这里的析构函数没有那么多细节,直接释放空间,然后处理其他的成员变量就行了
~String() { delete[] _str;//注意这里的delete[],不是delete _str = nullptr; _size = 0; _capacity = 0; }
二 迭代器实现
其实迭代器可以理解为是指针在进行,有的底层是指针有的是其他的方法,这里我们用指针去模拟实现
//迭代器 typedef char* iterator; typedef char* const_iterator; iterator begin() { return _str; } iterator end() { return _str + _size; } const_iterator begin()const { return _str; } const_iterator end()const { return _str + _size; }
迭代器也需要const类型,这样const类型的函数才能去调用,所以写两份。注意范围for就是无脑替换迭代器,本质和迭代器是一样的。
测试案例
#define _CRT_SECURE_NO_WARNINGS 1 #include"String.h" int main() { String str("Test string"); for (String::iterator it = str.begin(); it != str.end(); ++it) cout