**
数据结构–用C++实现string
**
这两天在写string类,实现方法是定长顺序存储。将串定义成字符数组,利用串名可以直接访问串值。用这种表示方法,串的存储空间在编译时确定,其大小不能改变。
代码如下:
文件MyString.h
#ifndef MyString_byNim
#define MyString_byNim
#include<iostream>
#include<string.h>
using namespace std;
#define MAX_STRLEN 256 //定长
class MyString
{
private:
char *ch; //串存放数组
int curLen; //串实际长度
int maxSize; //存放数组的最大长度
public:
MyString() //默认构造函数,构造一个最大长度为MAX_STRLEN,实际长度为0的字符串
{
maxSize=MAX_STRLEN;
curLen=0;
ch=new char[maxSize+1];
}
MyString(const char *init) //构造函数,构造一个最大长度为maxSize,由init初始化的新字符串对象
{
int len=strlen(init);
if(len>MAX_STRLEN)
maxSize=len;
else
maxSize=MAX_STRLEN;
curLen=len;
ch=new char[maxSize+1];
strcpy(ch,init);
}
MyString(const MyString& obj) //拷贝构造函数,由一个已有的字符串对象ogj构造一个新字符串
{
maxSize=obj.maxSize;
curLen=obj.curLen;
ch=new char[maxSize+1];
strcpy(ch,obj.ch);
}
~MyString() //析构函数,释放动态分配的串空间并撤销改字符串对象
{
delete []ch;
ch=NULL;
}
int length()const //函数返回串*this的实际长度
{
return curLen;
}
MyString operator()(int pos,int len) //则在串*this中从pos所指出位置开始连续取len个字符组成子串返回
{
MyString temp;
if(pos>=0&&pos<maxSize&&len>=0&&(pos+len)<maxSize)
{
len=((pos+len-1)>=curLen)?(curLen-pos):len; //如果所取长度大于串*this中现有长度,则取curLen-pos
temp.curLen=len;
for(int i=0,j=pos;i<len;i++,j++)
{
temp.ch[i]=ch[j];
}
temp.ch[len]='\0'; //串结尾符
}
return temp;
}
bool operator==(MyString& obj)const //运算符==重载
{
if(strcmp(ch,obj.ch)==0)
return true;
return false;
}
bool operator!=(MyString& obj)const //运算符!=重载
{
if(strcmp(ch,obj.ch)!=0)
return true;
return false;
}
MyString& operator=(MyString& obj) //串obj赋值给当前串*this
{
if(&obj != this)
{
delete []ch;
maxSize=obj.maxSize;
curLen=obj.curLen;
ch=new char[maxSize+1];
strcpy(ch,obj.ch);
}
return *this;
}
MyString& operator+=(MyString& obj)
{
int i,j;
if(curLen+obj.curLen>maxSize)
{
obj.curLen=maxSize-curLen; //如果相接后的长度大于maxSize,则取obj对象的前maxSize-curLen位
}
for(i=curLen,j=0;j<obj.curLen;i++,j++)
{
ch[i]=obj.ch[j];
}
curLen+=obj.curLen;
return *this;
}
char& operator[](int i) //取*this的第i个字符
{
if(i<0||i>=curLen)
throw "溢出";
return ch[i];
}
/*int find(MyString* pat)const//若串pat与串*this中的某个子串匹配,则函数返回第1次匹配时子串在串*this中的位置,若串pat为空或在串*this中没有匹配子串,则函数返回-1
{
int i=0;
int j=0;
for(i=0;i<=curLen-pat->curLen;i++)
{
for(j=0;j<pat->curLen;j++)
{
if(ch[i+j]!=pat->ch[j])
{
break;
}
}
if(j==pat->curLen)
{
return i;
}
}
return -1;//这里先挖个坑,目前还不知道如何调用,留以后修改
}*/
friend ostream& operator<<(ostream &os,const MyString &str) //运算符<<重载
{
int i;
for(i=0;i<str.curLen;i++)
{
os<<str.ch[i];
}
return os;
}
};
#endif
MyString初始化方法:
MyString s1="abc";
MyString s2=("abc");
这个类是根据别人写的来修改的,具体可参照:
http://blog.csdn.net/cainv89/article/details/51786007