数据结构–用C++实现string

**

数据结构–用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值