string类的模拟实现

模拟实现

class String
{
public:
typedef char* iterator;

private:
size_t _size;
size_t _capacity;
char* _str;
}

构造函数

String(char* s="")
{
_size=strlen(s);
_capacity=_size;
_str=new char[_capacity+1];
strcpy(_str,s);
}

拷贝构造(传统写法)

String(const String& s)
{
_str=new char[strlen(s._str)+1];
strcpy(_str,s._str);
_size=s._size;
_capacity=s._capacity;
}

拷贝构造(现代写法)

String(const String& s)                  
 {
  _str = nullptr;
  String str(s._str);
  swap(_str, str._str);
 }

赋值运算符(传统写法)

String& operator=(const String& s)        
 {
  if (this == &s)
  {
   return *this;
  }
  char* str = new char[strlen(s._str) + 1];
  strcpy(str, s._str);
  delete[] _str;
  _str = str; 
  return *this;
 }

赋值运算符(现代写法)

String& operator=(String s)
{
swap(_str,s._str);
return *this;
}

扩容

void Reserve(size_t n)
{
if(n>_capacity)
{
char* s1=new char[n+1];
strcpy(s1,_str);
delete[] _str;
_str=s1;
_capacity=n;
}
}

尾插字符

void pushback(char c)          
 {
  if (_size == _capacity)
  {
   size_t n =( _size == 0 ? 15 : 2 * _capacity);
   Reserve(n);
  } 
  _str[_size++] = c;
  _str[_size] = '\0';
 }

尾插字符串

void append(const char* str)   
 {
  int len = strlen(str);
  if ((len + _size) > _capacity)
  {
   Reserve(len+_size);
  }
  strcpy(_str + _size, str);
  _size += len;
 }

Resize

void Resize(int n,char c='\0')
{
if(n<_size)
{
_size=n;
_str[n]='\0';
}
else if((n>_size)&&(n<_capacity))
{
for(int i=_size;i<n;i++)
{
_str[i]=c;
}
_size=n;
_str[n]='\0';
}
else if(n>_capacity)
{
Reserve(n);
memset(_str+_size,c,n-_size);
_size=n;
_str[_size]='\0';
}
}

插入单个字符

void insert(int pos,char c)
{
assert(pos<=_size);
Reserve(_size+1);
int end=_size;
while(end>pos)
{
_str[end]=_str[end-1];
end--;
_str[pos]=c;
++_size;
_str[_size]='\0';
}
}

插入字符串

void insert(int pos,char* c)
{
assert(pos<=_size);
int len=strlen(c);
int end=_str+len;
Reserve(end+1);
while(end>pos+len-1)
{
_str[end]=_str[end-len];
end--;
}
for(int i=0;i<len;i++)
{
_str[pos+i]=c[i];
}
_size+=len;
_str[_size]='\0';
}

删除

void erase(inr pos, int len)
{
if(pos+len>_size)
{
_size=pos;
_str[_size]='\0';
}
else if(pos+len<=_size)
{
for(int i=0;i<_size-pos-len;i++)
{
_str[pos+i]=_str[pos+len+i];
}
_size-=len;
_str[_size]='\0';
}
}

operator+=

String& operator+=(const String& s)
 {
  append(s._str);
  return *this;
 }
 
 String& operator+=(const char c)
 {
 pushback(c);
 return *this;
 }

查找单个字符

size_t find(const char c)
{
for(int i=0;i<_size;i++)
{
     if(_str[i]==c)
     {
     return i;
     }
}
return npos;
}

查找字符串

size_t find(const char* str)
{
char* start=strstr(_str,str);
if(strart)
{
  return start-_str;
}
return npos;
}

模拟实现strstr

char* Strstr(char* dest,char* str)
{
while(*dest)
{
if(*dest==*str)
{
   char* mdest=dest;
   char* mstr=str;
   while(*mdest&&*str)
   {
     if(*mdest!=*str)
     {
      break;
      mstr++;
      mdest++;
     }
     if(*mstr=='\0')
     {
       return dest;
     }
   }
}
dest++;
}
return nullptr;
}

两个对象相加

String operator+(const String& s2)
{
String s(*this);
s.append(s2._str);
return s;

//String s(*this);
//s+=s2;
//return s;
}

迭代器

iterator begin()
{
 return _str;
}
iterator end()
{
 return _str+_size;
}

析构函数

~String()
{
if(_str)
{
delete[] _str;
_str=nullptr;
}
}

operator[]

char& operator[](size_t i)
{
return _str[i];
}
实验目的: 练习使用Java基本数据型。使用Java的String操作字符串和子串。 实验内容: 1.写一个程序提示用户键入某一货币数量(以分为单位),该程序应计算出如何用最少量的1元,50分,10分和1分硬币得到该数目。如195分最少可以用一个1元硬币,1个50分硬币,4个10分硬币和5个1分硬币组成。 注意不要用数组存放不同硬币的值。 2.写一个程序可以对两个字符串进行测试,得知第一个字符串是否包含在第二个字符串中。如字符串”PEN”包含在字符串“INDEPENDENT”中。 可以利用字符串方法 boolean regionMatches(int toffset, String other, int ooffset, int len) toffset 指从被调用方法的字符串的第几个字符开始测试,如果是0,表明从字符串的首字符开始。other是指使用的另一个字符串。ooffset指从另一个字符串的第几个字符开始。len指要比较几个字符。该方法返回boolean值。 在本题中,ooffset为0,因为我们要测试整个短字符串;len是短字符串的长度;所以应该用 big.regionMatches(index, small, 0, small.length()) 如果big指“independent",small指"pen",则index=2时为假,index=4时为真 (b)改进程序,当第一个字符串包含在第二个字符串中时,显示第一个字符串在第二个字符串中的起始位置。 (c)改进程序,即使当用户输入顺序错误时(第一个是长字符串,第二个是短字符串),能自动在长字符串中搜寻短字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值