string类模拟实现

string类部分函数模拟实现

对于一些常用的string类的函数进行模拟实现,通过对一些函数的模拟是实现了解,其底层的实现原理,加深对于string 类中的函数的理解

构造函数
 String(const char* str="")//使用缺省参数                 
   27       :_str(new char[strlen(str)+1])  //预留一个位置放‘\0’                       
   28     {                                                    
   29         strcpy(_str,str);                                //直接拷贝
   30         _size=strlen(str);                               
   31         _capacity=_size;                                 
   32     }                        
析构函数
 ~String()//析构函数                                   
   34     {                                                    
   35      delete[] _str;                                        
   36       _size=0;                                          
   37       _capacity=0;                                      
   38     }               
拷贝构造
 39    String(const String& s)//拷贝构造            
   40      :_str(nullptr),                              
   41      _size(0),       
   42      _capacity(0)                                       
   43     {                                                   
   44        String tmp(s._str);//创建一个临时变量               
   45        this->Swap(tmp);                                       //通过实现的string类的Swap进行交换
   46     }                                                   
   47                          
赋值运算符重载
  55     //赋值运算符重载                                    
   56    String& operator=(const String& s)                   
   57    {                                                    
   58      String tmp(s._str);                                
   59      swap(_str,tmp._str);                               
   60       _size=s._size;                                    
   61       _capacity=s._capacity;                            
   62       return *this;                                     
   63    }              
size()

返回字符串的有效字符长度,不包含’\0’

  68    size_t size()                                        
   69    {                                                    
   70      return _size;                                      
   71    }               
capacity()

返回当前字符串有效容量,不含’\0’

  _capacity(0)                                       
   43     {                                                   
   44        String tmp(s._str);                              
   45        this->Swap(tmp);                                 
   46     }          
swap()

string类中的交换函数,交换两个string类对象


 48    //string交换                                         
   49     void Swap(String& s)                                
   50     {                                                   
   51       swap(_str,s._str);                                
   52       swap(_size,s._size);                              
   53       swap(_capacity,s._capacity);                      
   54     }                 
迭代器

string类中的迭代器,begin()于end()

  typedef char* iterator;                              
   17     typedef char* const_iterator;                        
   18     iterator begin()                                     
   19     {                                                    
   20       return _str;                                       
   21     }                                                    
   22     iterator end()                                       
   23    {                                                     
   24      return _str+_size;                                  
   25    }           
c_str()

输出返回对象的字符串

 const char* C_str()                                  
   65    {                                                    
   66      return _str;                                       
   67    }                                                    
reserve()

增容,所增容量为n ,如果所给参数小于原容量,容量保持不变,否则增加指定长度的容量,不改变有效字符串的长度

void myString::String::Reserve(size_t n)
{
  if(n>_capacity)
  {
    char* tmp=new char[n+1];
    strcpy(tmp,_str);
    delete[] _str;
    _str=tmp;
    _capacity=n;
    _str[n+1]=0;
  }
}
resize()

重新调整字符串的大小

void myString::String::Resize(size_t n,char s)
{
    if(n<_size)
    {
       _str[n]=0;  //如果目标值小于有效字符串长度直接截断字符串
    }else if(n>_size&&n<_capacity||n>_capacity)
    {
      if(n>_capacity)
        this->Reserve(n);
      int pos=_size;
        while(pos!=n)
        {
          _str[pos++]=s;
        }
        _str[pos]='\0';
    }
}
push_back()

在结尾插入一个字符

void myString::String::Push_Back(char ch){
    
      if(_size==_capacity)
       this->Reserve(_capacity*2);
      _str[_size++]=ch;
      _str[_size]='\0';
}
append()

在结尾追加一个字符串

void myString::String::Append(const char* str){
      int len=strlen(str);
      if(_size+len>_capacity)
       this->Reserve((_size+len)*2);
         strcpy(_str+_size,str);
}
operator+=()

重载+=追加一个字符

myString::String& myString::String::operator+= (char ch){
      
     this->Push_Back(ch);  //复用之前实现好的函数
     return *this;
}

重载+= 追加一个字符串

myString::String& myString::String::operator+= (const char* str){
      this->Append(str);
      return *this;
}
find()

从pos位置后开始查找一个字符,找到返回字符在字符串中的下标,找不到返回全局变量npos 也就是-1

size_t myString::String::Find(char ch,size_t pos){
    
      if(pos>_size||pos<1)
        return npos;
      while(pos!=_size)
      {
          if(_str[pos]==ch)
            return pos;
          else pos++;
      }
      return npos;
}

查找一个字符串,从pos位置开始
返回 找到后的第一个字符的位置

size_t myString::String::Find(char* str ,size_t pos){
      
        if(pos>_size||pos<1)
          return npos;
        int len=strlen(str);

        int i=pos,j=0;
        while(i!=_size)
        {
           int start=i;
          while(j!=len&&_str[i]==str[j])
          {
                j++;
                i++;
          }
          if(j==len)
            break;
          i=start+1;
          j=0;          
        }

        if(j=len&&i!=_size)
          return i-len;
      
        return npos;
}
insert()

在pos位置之后插入一个字符

void myString::String::Insert(size_t pos,char ch){
   if(pos>=_size||pos<1)
     perror("pos error");
   if(_size==_capacity)
     this->Reserve(_capacity*2);
    int cur=_size;
   while(cur!=pos-1)
   {
      _str[cur+1]=_str[cur];
      cur--;
   }
   _size+=1;
   _str[pos]=ch;
}

在pos位置后再插入一个字符串

void myString::String::Insert(size_t pos,char* str){

     if(pos>=_size||pos<0)                       
     perror("pos error"); 
   int len=strlen(str);
     if(_size+strlen(str)>_capacity)
       this->Reserve((_size+len)*2);
     _size+=len;
     int cur = _size ;
     while(cur!=pos-1)
     {
       _str[cur+len] = _str[cur];
       cur--;
     }
     while(len--)
     {
        _str[pos++] = *str++;
     }
}
erase()

从某一位置开始,删除指定长度的字符
如果删除长度超过

size_t  myString::String::Erase(size_t pos, size_t len)
{
    if(pos>_size || pos<0)
      perror("pos error");
   if(pos+len >= _size)
     return npos;
   int k = len;
   while(k--)
   {
     _str[pos] = _str[pos+len];
     pos++;
   }
   _str[pos]='\0';
   _size-=len;
}
assign()

重新分配字符串

myString::String& myString::String::assign(char* str)
{
   strcpy(_str,str);
   _size=strlen(str);
} 
operator<< 与 operator<<

输入输出的重载,因为要访问私有数据,out又要做左操作数,所以要将其声明为类的友元函数,在类外定义。

ostream& operator<<(ostream& out,myString::String& s)                                                                             
  134 {                                                                                                                                 
  135     out<<s._str;                                                                                                                  
  136                                                                                                                                   
W>137 }                                                                                                                                 
  138 istream& operator>>(istream& _cin ,myString::String& s)                                                                           
  139 {                                                                                                                                 
  140     _cin>>s._str;  return _cin;                                                                                                   
  141                                                                                                                                   
  142 }                    
operator < 和 operator >
 

猜你喜欢

转载自blog.csdn.net/M_jianjianjiao/article/details/84503571