目标实现:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<map>
#include<stack>
#include "mystring.h"
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
mystring str="123",str1; // 构造函数
str1 = "456"; // 赋值运算符重载
cout<<str<<endl; // 123,流输出运算符重载
str[1] = 'a'; // 下表运算符重载
cout<<str<<endl; // 1a3
mystring str2 = str1; // 拷贝构造函数
cout<<str+str2<<endl; // 1a3456,+重载
str = str1 = str2; // 赋值运算符重载
cout<<str<<str1<<endl; // 456456
str += str2; // +=运算符重载
cout<<str<<endl; // 456456
// cout<<"*******"<<endl;
str -= "45"; // operator-=(char * str);
cout<<str<<endl; // 4646
return 0;
}
其中特别提醒的是对于-=的重载是用的kmp来写的,-=的意思就是在模板串中找到所有的字串然后删去,因为这儿的字符串还不算长,所以可以选择暴力来做,但是建议可以用kmp算法,+的实现有一个很大的坑,刚开始我没有意识到这个问题,最后才发现我重载+的时候把原来的左串改变了,+这个地方不能改变原来的值,只有+=才可以改变左值
mystring.h文件:
#ifndef MYSTRING_H
#define MYSTRING_H
#include<iostream>
using namespace std;
class mystring
{
private:
char *sstring;
mystring KMP( char *,const char *);
public:
mystring(char *str="");
mystring &operator=(char *a);
mystring &operator=(const mystring &a);
friend ostream &operator<<(ostream &o,const mystring &a);
char &operator[](int index);
mystring operator+(const mystring &a);
mystring operator+=(const mystring &a1);
mystring& operator-=(const char *a1);
~mystring();
mystring(const mystring& other);
protected:
};
#endif // MYSTRING_H
mystring.cpp文件:
#include "mystring.h"
#include<cstring>
#include<iostream>
#include<cstdio>
using namespace std;
mystring::mystring(char *str)
{
//ctor
int len =strlen(str)+1;
sstring =new char[len];
strcpy(sstring,str);
}
mystring::~mystring()
{
//dtor
delete []sstring;
}
mystring::mystring(const mystring& other)
{
//copy ctor
cout<<"======"<<endl;
int len =strlen(other.sstring)+1;
sstring = new char[len];
strcpy(sstring,other.sstring);
}
ostream &operator<<(ostream &o,const mystring &a)
{
o<<a.sstring;
return o;
}
char &mystring::operator[](int index)
{
static char ch=0;
if(index>=0&&index<strlen(this->sstring))
{
return sstring[index];
}
else
return ch;
}
mystring &mystring::operator=(char *a)
{
delete []sstring;
int len =strlen(a)+1;
sstring = new char[len];
strcpy(sstring,a);
return (*this);
}
mystring &mystring::operator=(const mystring &a1)
{
delete []sstring;
int len = strlen(a1.sstring) + 1;
sstring = new char[len];
strcpy(sstring, a1.sstring);
return (*this);
}
mystring mystring::operator+(const mystring &a)
{
mystring k=sstring;
k+=a;
return k;
}
mystring mystring::operator+=(const mystring &a1)
{
int len = strlen(sstring) + strlen(a1.sstring) + 1;
char *newstr = new char[len];
memset(newstr, 0, len);
strcpy(newstr, sstring);
strcat(newstr, a1.sstring);
delete[] sstring;
sstring = newstr;
return *this;
}
mystring& mystring::operator-=(const char* a1)
{
(*this)=KMP(this->sstring,a1);
// cout<<ss<<endl;
return (*this);
}
mystring mystring::KMP(char *a3,const char *a4)
{
char *a1=(char*)a3;
char *a2=(char*)a4;
// cout<<a1<<"***"<<a2<<endl;
// cout<<a3<<"***"<<a4<<endl;
int n=strlen(a1);
int m=strlen(a2);
int Next[100];
int i=0,j=-1;
Next[0]=-1;
while(i<m)
{
if(j==-1||a2[i]==a2[j])
{
i++,j++;
Next[i]=j;
}
else
j=Next[j];
}
i=0,j=0;
while(i<n)
{
if(j==-1||a1[i]==a2[j])
i++,j++;
else
j=Next[j];
if(j==m)
{
for(int k=i-j; k<i; k++)
{
a1[k]=' ';
}
j=0;
}
}
// delete []sstring;
char *a5;
// cout<<"***"<<endl;
int cnt=0;
for(int p=0; p<n; p++)
if(a1[p]!=' ')
cnt++;
a5=new char(cnt+1);
int k=0;
for(int p=0; p<n; p++)
{
// printf("sssss\n");
if(a1[p]!=' ')
{
a5[k]=a1[p];
k++;
}
}
a5[k]=0;
mystring a6;
strcpy(a6.sstring,a5);
// cout<<a6.sstring<<endl;
// cout<<"+++++++++++++++++++++"<<endl;
// cout<<a6<<endl;
//printf("ober\n");
return a6;
}