【C++】实现STL模板类string

#include<String>
#include <iostream>
using namespace std;
class String
{
public:
	String()
    {
		_str = new char[1];
		_str[0] = '\0';
		_size = 0;
		_capacity = 1;
	}

    String(const char* str)
	{
		_size = strlen(str);
	    _capacity = strlen(str)+1;
		_str = new char[strlen(str)+1];
	    strcpy(_str,str);
		
	}	
	
	~String()
	{
		if(_str)
		{
			cout<<"析构"<<endl;
			delete []_str;
		}
	}
    String(const String& str)
	{
		_str = new char [strlen(str._str) + 1];
		strcpy(_str,str._str);
		_size = str._size ;
		_capacity = str._capacity ;
	}
	String& operator=(const String& str)
	{
		if(this != &str)
		{
			delete _str;
			_str = new char[strlen(str._str) + 1];
			strcpy(_str,str._str);
			_size = str._size ;
			_capacity = str._capacity ;
		}
		return *this;
	}

public:
	const char* GetStr()
	{
		return _str;
	}

	void _CheckCapacity(size_t capacity)
	{
		if(_capacity < (capacity +_capacity))
		{ 
			
			_capacity *= 2;
			char* tmp = new char[_capacity];
			strcpy(tmp,_str);
			delete []_str;
			_str = tmp;
		}
	}

	void PushBack(char ch)
	{
		_CheckCapacity(1);
		_str[_size] = ch;
		_size++;
		_str[_size] = '\0';
	}

	void PopBack()
	{
		if(_str)
		{
			_str[_size - 1] = '\0';
			_size--;
		}
		else
		{
		  cout<<"您要删除的节点不存在"<<endl;
		}
	}

	void Insert(size_t pos, const char ch)
	{
		int tmp2 = _capacity;
		int tmp = _size;
		_CheckCapacity(1);
		while(tmp2 != pos)
		{
			_str[tmp] = _str[tmp-1];
			tmp--;
			tmp2--;
		}	
          	
		_str[_size + 1] = '\0';
		_size++;
		_str[ pos -1] = ch;
	}  
	

	void Insert(int pos, const char* str)
	{
		
		int len = strlen(str);

		_CheckCapacity(_size + len + 1);
		
		int i = _size;
		int j = _size + len;
		for(; i>=pos ;)
		{
			_str[j--] = _str[i--];
		}
		while(*str)
		{
			_str[pos++] = *str++;
		}
		_size += len;
		_str[_size] = '\0';
	}

	int Find(char ch)
	{
		char* tmp = _str;
		while(*tmp)
		{
			if(*tmp == ch)
			{
				return 1;
			}
			tmp++;
		}
		return 0;
	}
	int Find(const char* str)
	{
		const char* src = _str;
		const char* sub = str;
		int srclen = strlen(src);
		int sublen = strlen(sub);

		if(sublen > srclen)
		{
			return -1;
		}
		int srcIndex = 0;
		while(srcIndex <= srclen - sublen)
		{
			int i = srcIndex, j = 0;
			while(i < srclen  && j<sublen && src[i]==sub[j])
			{
				++i;
				++j;
			}
			if(j == sublen)
			{
				return srcIndex;
			}
			++srcIndex;
		}
		return -1;
	}

public:
	// 不能用C库的函数
	bool operator<(const String & s)
	{
		const char* str1 = _str;
		const char* str2 = s._str;
        while(*str1 && *str2)
		{
			if(*str1 < *str2)
			{
				return true;
			}
			else if(*str1 > *str2)
			{
				return false;
			}
			else
			{
				str1++;
				str2++;
			}
		}
		if(*str1)
		{
			return false;
		}
		if(*str2)
		{
			return true;
		}
	}
	bool operator>(const String & s)
	{
		return !(this<s._str ||this == s._str);
	}
	bool operator<=(const String & s)
	{
		return !(this>s._str);
	}
	bool operator>=(const String & s)
	{
		return !(this<s._str);
	}
	bool operator==(const String & s)
	{
		const char* str1 = _str;
		const char* str2 = s._str;
        while(*str1 && *str2)
		{
			if(*str1++ != *str2++)
			{
				return false;
			}
		}
		if(*str1 == *str2)//比较'\0'
		{
			return true;
		}
		else
			return false;
	}

	String operator+(const String& s)
	{
	/*	String tmp(_str);
		char* str = s._str;
		while (*str)
		{
			tmp.PushBack(*str++);
		}*/

		String tmp(_str);
		tmp.Insert(_size, s._str);

		return tmp;
	}

	String operator+=(const String & s)
	{
		Insert(_size,s._str);
		return *this;
	}

	friend ostream& operator<<(ostream& os, const String& s)
	{
		os<<s._str;
        return os;
	}
	friend istream& operator>>(istream& is, String& s);
private:
	size_t _size;		// 大小
	size_t _capacity;	// 容量

	char* _str;			// 指向字符串的指针
};

ostream& operator<<(ostream& os, const String& s)
{
	os<<s._str;

	return os;
}

istream& operator>>(istream& is, String& s);


void Test1()
{
	String s1;
	String s2("abcd");
	/*String s3("efgh");
	s3 = s2;
	s3.PushBack('x');
	s3.PopBack();*/
	/*s2.Insert(2,'x');
	cout<<s2<<endl;*/
	s2.Insert(2,"efg");
	cout<<s2<<endl;
}

void Test2()
{
	String s1("abcd");
	int ret = s1.Find('e');
	cout<<ret<<endl;
}

int main()
{
	Test1();
	//Test2();
	getchar();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值