C++实现string

 gitee仓库Data structure and algorithm: 数据结构与算法 - Gitee.com

#ifndef MY_STRING_MYSTRING_H
#define MY_STRING_MYSTRING_H

#endif //MY_STRING_MYSTRING_H
#include<iostream>
using namespace std;
namespace wzh
{
    class STRING
    {
    public:
        //迭代器(在string下可以理解为指针)
        typedef char* iterator;
        typedef const char* const_iterator;
        iterator begin()
        {
            return _str;
        }
        iterator end()
        {
            return _str+_size;
        }
        const_iterator begin() const
        {
            return _str;
        }
        const_iterator end() const
        {
            return _str+_size;
        }
        //默认构造函数,无返回类型
        STRING(const char* str="")
                :_size(strlen(str))
        {
            _capacity=_size==0?3:_size;
            _str=new char[_capacity+1];
            strcpy(_str,str);
        }
        //析构函数
        ~STRING()
        {
            delete[] _str;
            _str= nullptr;
            _size=_capacity=0;
        }
        //拷贝构造
        STRING(const STRING& s)
        :_size(s._size)
        ,_capacity(s._capacity)
        {
            _str=new char[s._capacity+1];
            strcpy(_str,s._str);
        }
        //赋值重载
        STRING& operator=(const STRING& s)
        {
            if(this!=&s)
            {
                char* tmp=new char[s._capacity+1];
                strcpy(tmp,s._str);
                delete[] _str;
                _size=s._size;
                _capacity=s._capacity;
                strcpy(_str,tmp);
            }
            return *this;
        }
        //变成char*类型,非string类型
        const char* c_str()
        {
            return _str;
        }
        //重载方括号,可以修改值
        char& operator[](int index)
        {
            return _str[index];
        }
        //重载方括号,不可以修改值
        const char& operator[](int index) const
        {
            return _str[index];
        }
        //相等
        bool operator==(const STRING& s)const
        {
            return strcmp(_str,s._str)==0;
        }
        //不相等
        bool operator!=(const STRING& s)const
        {
            return !(_str==s._str);
        }
        //大于
        bool operator>(const STRING& s)const
        {
            return strcmp(_str,s._str)>=1;
        }
        //大于等于
        bool operator>=(const STRING& s)const
        {
            return (*this>s)||(*this==s);
        }
        //小于
        bool operator<(const STRING& s)const
        {
            return !(*this>=s);
        }
        //小于等于
        bool operator<=(const STRING& s)const
        {
            return (*this<s)||(*this==s);
        }
        //重载+=
        STRING operator+=(const char s)
        {
            push_back(s);
            return *this;
        }
        STRING operator+=(const char* s)
        {
            append(s);
            return *this;
        }
        //返回大小
        const size_t size() const
        {
            return _size;
        }
        void resize(size_t n,char c='\0')
        {
            //小于_size的时候是删除数据
            if(n<=_size)
            {
                _size=n;
                _str[_size]='\0';
            }
            else
            {
                if(n>_capacity)
                {
                    reserve(n);
                }
                size_t i=_size;
                while(i<n)
                {
                    _str[i]=c;
                    ++i;
                }
            }
            _size=n;
            _str[_size]='\0';
        }
        //预留大小
        void reserve(size_t n)
        {
            char* tmp=new char[n+1];
            strcpy(tmp,_str);
            delete[] _str;
            _str=tmp;
            _capacity=n;
        }
        //尾插(单个字符)
        void push_back(const char s)
        {
            if(_size+1>_capacity)
            {
                STRING::reserve(_capacity*2);
            }
            _str[_size]=s;
            ++_size;
            _str[_size]='\0';
        }
        //插入多个字符
        void append(const char* s)
        {
            int len=strlen(s);
            if(_size+len>_capacity)
            {
                STRING::reserve(_size+len);
            }
            //不用strcat的原因是,strcat要自己找\0,而这里我们已经知道莫问是什么了,用strcat会浪费时间
            strcpy(_str+_size,s);
            _size=_size+len;

        }
        //在指定位置插入(单个字符)
        void insert(size_t pos,const char c)
        {
            assert(pos<=_size);
            if(_size+1>_capacity)
            {
                reserve(_capacity*2);
            }
            int end=_size+1;
            while(end>pos)
            {
                _str[end]=_str[end-1];
                end--;
            }
            _str[pos]=c;
            ++_size;
        }
        //在指定位置插入多个字符
        void insert(size_t pos,const char* c)
        {
            int len=strlen(c);
            if(_size+len>_capacity)
            {
                reserve(_size+len);
            }
            int end=_size+len;
            while(end-len+1>pos)
            {
                _str[end]=_str[end-len];
                end--;

            }
            strncpy(_str+pos,c,len);
        }
        //删除pos的len个
        void erase(size_t pos,size_t len=npos)
        {
            if(len==npos||pos+len>=_size)
            {
                _size=pos;
                _str[pos]='\0';
            }
            else
            {
                strcpy(_str+pos,_str+pos+len);
                _size-=len;
            }
        }
        //交换
        void swap(STRING& s)
        {
            std::swap(_str,s._str);
            std::swap(_size,s._size);
            std::swap(_capacity,s._capacity);
        }
        size_t find(const char ch,size_t pos=0)const
        {
            for(int i=pos;i<_size;i++)
            {
                if(_str[i]==ch)
                {
                    return i;
                }
            }
            return npos;
        }
    private:
        char* _str;
        int _size;
        int _capacity;
        static const size_t npos = -1;
    };
    ostream& operator<<(ostream& out,const STRING& s)
    {
        for(int i=0;i<s.size();i++)
        {
            out << s[i];
        }
        return out;
    }
    istream& operator>>(istream& in,STRING& s)
    {
        char ch=in.get();
        while(ch!=' '&&ch!='\n')
        {
            s+=ch;
            ch=in.get();
        }
        return in;
    }
}
#include"mystring.h"
using namespace std;
using namespace wzh;
int main()
{
    STRING s1("wzh");
    STRING s2(s1);
    STRING s3("abcde");
    STRING::iterator it=s1.begin();
//    while(it!=s1.end())
//    {
//        *it=*it+1;
//        it++;
//    }
//    STRING::const_iterator it1=s1.begin();
//    while(it1!=s1.end())
//    {
//        *it1=*it1+1;
//        it1++;
//    }

    cout << s1.find('b') << endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值