模拟实现C++中的string类

一、用一般方法实现string类

c<span style="font-size:24px;">lass String
{
	
	friend ostream& operator<<(ostream& os,String& str);
public:
    String (const char* str="")                      //构造函数
		:_capacity(size(str)+1)
		,_sz(size(str))
		,_str(new char[_capacity])
	{
		strcpy(_str,str);
	}

	String(const String& s)                     //拷贝函数(深拷贝)
		:_sz(s._sz )
		,_capacity(s._capacity )
		,_str(new char[s._capacity])
	{
		strcpy(_str,s._str);
	}

	String& operator= (String& s)              //把字符串s赋给当前字符串
	{
	    std::swap (_sz,s._sz );
		std::swap(_capacity,s._capacity );
		std::swap(_str,s._str );
		return *this;

	}
	char& operator[](int index)               
	{
		return _str[index];                //_str[3]='w'
	}
	char *c_str()
	{
		return _str;                       //返回字符串首地址
	}
	void PushBack(const char c)                //尾插
	{
		CheckCapacity(1);                  //检测容量
		_str[_sz++]=c;
		_str[_sz]='\0';
	}
	~String ()                                 //析构函数
	{
		if(_str!=NULL)
		{
			_sz=0;
			_capacity=0;
			delete[] _str;
			_str=NULL;
			
		}
	}
private:
	void CheckCapacity(int count)
	{
		if(_sz+count >=_capacity)
		{
			int Newcapacity=(2*_capacity>_sz+count)?2*_capacity:_sz+count;
			char *tmp=new char[Newcapacity];
			strcpy(tmp,_str);
			delete[] _str;
			_str=tmp;
			_capacity=Newcapacity;
		}   
	}
	int size(const char *str)          
	{
		return strlen(str);
	}
private:
	char *_str;
	int _sz;
	int _capacity;
};
 ostream& operator<<(ostream& os,String& str)     //输出流
{
	os<<str._str  ;        
	return os;
}
void test()
{
	String str1("abcdef");
	String str2;
	str2=str1;
	str2[3]='w';
	str2.PushBack('g');
	cout<<str2<<endl;
}
</span>
二、用写时拷贝的方法实现string类

开辟了两块地址,一个用来存字符串,另一个用来计数。

class String
{
	friend ostream& operator<<(ostream& os,String& str);
public:
	String(const char* str="")
		:_str(new char[strlen(str)+1])
		,_pcount(new int[1])
	{
		*_pcount=1;
		strcpy(_str,str);
	}
	String(const String& s)
	{
		_pcount=s._pcount ;
		++(*_pcount);      //++pcount[0];
		_str=s._str ;      //cout<<(*_pcount)<<endl;
	}
	char& operator[](int index)
	{
		if((*_pcount)>1)
		{
			--_pcount[0];
			char* Newstr=new char[strlen(_str)+1];
			int* Newcount=new int[1];
			strcpy(Newstr,_str);
			*Newcount=1;
			_str=Newstr;
			_pcount=Newcount;
		}
		return _str[index];
	}
	String& operator=(String& s)
	{
		if(_pcount[0]==1)
		{
			cout<<"str3=str1"<<endl;
			delete[] _str;
			delete[] _pcount;
			_str=s._str;
			_pcount=s._pcount ;
			++_pcount[0];
		}
		else
		{
			cout<<"str1=str3"<<endl;
			_str=s._str;
			--_pcount[0];
			_pcount=s._pcount ;
			++_pcount[0];
		}
		return *this;
	}
	void PushBack(char c)
	{
		if(_pcount[0]>1)
		{
			--_pcount[0];
		}
		char* Newstr=new char[strlen(_str)+1+1];
	    int* Newcount=new int[1];
	    strcpy(Newstr,_str);
		*Newcount=1;
		if(_pcount[0]==1)
		{
			delete[] _str;
			delete[] _pcount;
		}
		_str=Newstr;
	    _pcount=Newcount;
		int n=strlen(_str);
		_str[n++]=c;
		_str[n]='\0';
	}
	~String()
	{
		if(--_pcount[0]==0)
		{
			cout<<"ss"<<endl;
			delete[] _pcount;
			delete[] _str;
			_pcount=NULL;
			_str=NULL;
		}
	}
private:
	char* _str;
	int* _pcount;
};
ostream& operator<<(ostream& os,String& str)
{
	os<<str._str;
	return os; 
}

void test()
{
	String str1("abcdef");
	String str2(str1);
	str2.PushBack ('g');
	str2.PushBack ('h');
	/*String str3;
	str1=str3;*/
	cout<<str2<<endl;
	str2=str1;
	String str2(str1);
	str2[3]='w';
	cout<<str2<<endl;
	String str3("abcdef");
}

三、用写时拷贝的方法来实现string类

开辟了一块地址,前四个字节用来计数,后面的空间用来存字符串。

class String
{
	friend ostream& operator<<(ostream& os,String& str);
public:
	String(const char* str="")
		:_str(new char[strlen(str)+1+4])	
	{
		_str+=4;             //找到存字符的区域
		Getcount()=1;   
		strcpy(_str,str);
	}
	String(const String& s)
	{
		_str=s._str;
		++Getcount();  
	}
	char& operator[](int index)
	{
		if(Getcount()>1)
		{
			--Getcount();
			char* Newstr=new char[strlen(_str)+1+4];
			Newstr+=4;
			strcpy(Newstr,_str);
			_str=Newstr;
			Getcount()=1;	
		}
		return _str[index];
	}
	String& operator=(String& s)
	{
		if(this!=&s)
		{
			if(--Getcount()==0)
			{
				delete[] (_str-4);
			}
			++(s.Getcount());
			_str=s._str;
		}
		return *this;
	}
	~String()
	{   
		cout<<"dd"<<endl;
		if(--Getcount()==0)
		{
			cout<<"ss"<<endl;
			delete[] (_str-4);
		}
	}
private:
	int& Getcount()
	{
		return*((int *)_str-1);
	}
private:
	char* _str;
};
ostream& operator<<(ostream& os,String& str)
{
	os<<str._str;
	return os; 
}
void test()
{
	String str1("abcd");
	String str2;
	str2[2]='w';
	
	str2=str1;
	cout<<str2<<endl;
}
C++中string类有许多用法,我只实现了其中的一部分, 谢谢


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值