模拟实现C++中的string类

原创 2016年08月30日 19:42:28

一、用一般方法实现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类有许多用法,我只实现了其中的一部分,谢谢


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

模拟实现C++STL中的string类

浅拷贝: 默认的拷贝构造函数(值拷贝)。会出现两个指针维护同一块空间的问题,可能会一个指针释放空间导致另一个指针访问非法空间。 深拷贝: 自己构造拷贝构造函数,即自己开辟新空...

C++中String类模拟实现以及深拷贝浅拷贝

在C语言中/C++中,字符串是一个应用很广泛的类型,也是很基础的类型,C语言并没有直接处理字符串的操作而是采用字符指针和字符串数组进行操作,而在C++中标准库为我们封装了一个字符串的类供我们使用,使用...

C++面试题之模拟实现string类

C++中的string类是一个很常见的面试题,string类里必须有的构造函数,拷贝构造,赋值运算符重载,析构函数等成员函数,下面看看是如何实现以及如何处理动态内存 写时拷贝技术是通过"引用计数"...

【c++】模拟实现string类__实现增删查改

代码如下:String.h文件#pragma once#include #include using namespace std; class String { public: String(...

c++中string的模拟实现

c++中的string类可以实现字符串对象的一系列操作,如下图就是从cplusplus上截取的string的一部分功能: 接下来我就简单模拟几个函数实现 首先,我们要给出完整的string类,...

C++面试题模拟实现String

C++ 的一个常见面试题是让你实现一个 String 类,通常面试官只会给十五分钟左右,不可能要求具备 std::string 的功能,但至少要求能正确管理资源不存在内存泄漏。具体来说: 需要编写构...

c++模拟实现string

#define _CRT_SECURE_NO_WARNINGS 1 #include using namespace std; class String { public: Strin...

模拟c++的string类

#include #include using namespace std; #pragma warning(disable:4996) #define DEFAULT_CAPACITY 5class...

C++ 模拟String类增删查改

String是C++中的重要类型,程序员在C++面试中经常会遇到关于String的细节问题,甚至要求当场实现这个类。只是由于时间关系,可能只要求实现构造函数、析构函数、拷贝构造函数等关键部分。Stri...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)