概述
MySTL实现
实现STL库中的基础容器及基本函数
文章目录
- MySTL实现
- String类的实现
- MyString头文件
- 具体实现
- 1.构造函数
- 2.析构函数
- 3.重载
- 1)重载=
- 2)重载+=
- 3)重载==
- 4)重载[]
- 5)重载<<
- 4.其他成员函数
- 简单测试
- 总结
String类的实现
对string类的基本功能进行复现,找到了一些错误和c++编程中的细节问题,都在此记录下来。MyString中实现了基本的构造函数、析构函数,重载了常用符号,并且给出了一些常用函数的实现。
在实现过程中,对于是否加入const有两种情况:1.在参数前加入说明该函数不更改此参数;2.在函数后加入说明该函数不更改成员的值。
MyString头文件
class MyString {
private:
char* m_data;//指针指向字符数组,4字节
size_t m_size;//字符串长度
public:
//构造函数
MyString(const char* cstr = 0);//1、无参构造 2、使用c风格字符串构造
MyString(const MyString& str);//3、拷贝构造
MyString(int n, const char c);//4、使用n个字符c初始化
//析构函数
~MyString();
// 重载=
MyString& operator=(const MyString& str);//重载MyString=MyString
//重载+=
MyString& operator+=(const MyString& str);
//重载==
bool operator==(const MyString& str);
//重载[]
char& operator[](int n);
//重载<<
friend ostream& operator<<(ostream& out, MyString& str);//重载<<声明为友元函数
//返回C风格字符串
char* get_c_str() const { return m_data; }
//返回字符串长度
size_t
size() const { return m_size; }
//返回由pos开始的n个字符组成的字符串
MyString substr(int pos , int n) const;
//在pos处插入,结果传入原先存在的变量中,返回引用
MyString& insert(int pos, const MyString& str);
//删除从pos开始的n个字符
MyString& erase(int pos, int n);
//字符串比较
int compare(const MyString& str) const;
//获取某位字符
char& at(int n);
//查找字符子串,从pos开始返回第一个字母的位置
//缺省时从头开始,带参形参写在后面
int find(const MyString& str, int pos = 0);
int find(const char* ch, int pos = 0);
//split方法,按字符切分字符串,返回MyString数组
vector<MyString> split(const MyString& flag);
};
#endif // _MYSTRING_
具体实现
以下分别给出每个函数的具体实现、遇到的问题和需要关注的细节。
1.构造函数
在声明构造函数时,若有默认参数,则不应该再次声明和该默认参数相同的构造函数,例如:
MyString(const char* cstr = 0);
MyString();//无参构造函数和上述构造函数的默认参数情况重合,会提示多个默认构造函数
MyString::MyString(const char* cstr) {
if (cstr) {
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
m_size = strlen(cstr);
}
else {//对应无参构造函数
//传入空字符串,创建空字符串
m_data = new char[1];
*m_data = '