仿照string类,自己手动实现 My_string
头文件
#ifndef SEQLIST_H
#define SEQLIST_H#include <iostream>
#include <cstring>
using namespace std;
using datatype = char;class My_string
{
private:datatype *ptr; //顺序表字符数组int size = 15; //数组的最大int len; //数组的实际长度public:My_string(); //无参构造//有参构造My_string(const char* src);My_string(int num,char value);//拷贝构造My_string(const My_string &other);//拷贝赋值My_string &operator = (const My_string &other);//析构函数~My_string();bool empty(); //判空void push_back(datatype value); //尾插void pop_back(); //尾删int listsize(); //求长度datatype & at(int inex); //获取任意位置元素void clear();//清空char *data();//返回C风格字符串int get_length();//返回当前最大容器void show(); //展示void append(const char *ptr);//扩容
};#endif // SEQLIST_H
源文件
#include "seqlist.h"My_string::My_string():size(15) //无参构造
{this->ptr = new char[size];this->ptr[0] = '\0';this->len = 0;
}
//有参构造
My_string::My_string(const char* src)
{len = strlen(src)+1;this->ptr = new char[len];strcpy(ptr,src);
}My_string::My_string(int num,char value)
{ptr = new char[num +1];for(int i = 0;i<num;i++){this->ptr[i] = value;}this->len = num;
}
//拷贝构造
My_string::My_string(const My_string &other):ptr(new char[other.size]),size(other.size),len(other.len)
{strcpy(this->ptr,other.ptr);this->size = other.size;this->len = other.len;
}
//拷贝赋值
My_string &My_string::operator = (const My_string &other)
{if(this != &other){delete []ptr;size = other.size;ptr = new char[size + 1];strcpy(ptr,other.ptr);}return *this;
}
//析构函数
My_string::~My_string()
{delete []ptr;
}
char *My_string::data()//返回C风格字符串
{return ptr;
}
//判空
bool My_string::empty()
{return ptr[0] == 0;
}//尾插
void My_string::push_back(datatype value)
{this->ptr[len++] = value;
}//尾删
void My_string::pop_back()
{if(this->empty()){cout<<"表为空无删除对象"<<endl;return;}this->len--;
}
//求长度
int My_string::listsize()
{return this->len;
}
//获取任意位置元素
datatype & My_string::at(int index)
{if(this->empty()){throw std::out_of_range("表为空无对象");}if(index>this->len||index<=0){throw std::out_of_range("位置错误");}return this->ptr[index-1];
}//展示
void My_string::show()
{if(this->empty()){cout<<"表为空无对象"<<endl;return;}cout<<"当前顺序表中的元素是:";cout<<"ptr = "<<ptr<<" ";len = strlen(ptr);cout<<"len = "<<len<<endl;
}
int My_string::get_length()//返回当前最大容器
{return this->size;
}
void My_string::clear()//清空
{delete []ptr;ptr = new char[1];ptr[0] = '\0';len = 0;
}void My_string::append(const char *src)
{int src_len = strlen(src);while(len+src_len >= size){size *= 2;char *new_ptr = new char[size];strcpy(new_ptr,ptr);delete []ptr;ptr = new_ptr;}strcat(ptr,src);len += src_len;
}
主程序
#include "seqlist.h"
int main()
{My_string s1("Hello");//拷贝构造My_string s2 = s1;s2.show();//无参构造My_string s3;//拷贝赋值s3 = s1;s3.show();s3.push_back('a');//C字符风格cout<<s3.data()<<endl;s3.pop_back();s3.append(" world ,good");s3.show();//求实际长度cout<<"s3容器的实际长度 = "<<s3.listsize()<<endl;cout<<"s3容器的最大长度 = "<<s3.get_length()<<endl;cout<<"s3容器2号元素= "<<s3.at(2)<<endl;//clears3.clear();s3.show();return 0;
}
效果图
思维导图