string类的模拟实现以及对cstring一些库函数的复习

引入 

 学习完string类的之后,为了加深自己对string类的理解,我们可以选择不用c++string库(<string>),而用我们之前的c语言学习的cstring(<cstring>(<string.h>))库函数(间接地也巩固了自己对cstring中函数的运用)来模拟实现c++string类的功能,这里我只模拟了常用得string类中的方法。具体代码如下:

复习常用的cstring函数

int puts(char* str)

其作用是将一个字符串(以'\0'结束的字符序列)输入到终端。

int gets(const char* str)

其作用是从终端输入一个字符串到字符数组中

strcat(char* str1,char* str2)

其作用是将str2拼接到str1的末尾(拼接时函数会将str1末尾的'\0'取消)

 strncat(char* str1,char* str2)

将str2的前n个字符拼接到str1的后面

strcpy(char* str1,char*str2)

其作用是将str2的内容复制到str1(拼接时函数会将str1末尾的'\0'取消)

strncpy(char* str1,char*str2,n) 

其作用是将str2前n个字符的内容复制到str1

 strcpy是将str和其后的'\0'都复制到了str1中

验证

void memset (void* ptr,int value,size_t num)

将ptr指向的内存前num个设为一个确定值

using namespace std;
class String{//string("str")string(size_t n,char c)
public:
	//构造和析构
	String(int n,char c=' ')
	{
		if (n < 0){ 
			assert(false);
		}
		_str = new char[n + 1];
		memset(_str, c, n);
		_capacity = _size = strlen(_str);
	}
	String(const char* str = "")
	{
		if (str == nullptr)
			assert(false);
		
			_str = new char[strlen(str) + 1];
			strcpy(_str, str);
		_capacity = _size = strlen(str);
	}
	String(const String &s)
	:_capacity(s._capacity)
	,_size(s._size)
	{
		_str = new char[s._capacity + 1];
		strcpy(_str, s._str);
		
	}
	String operator =(String &s){
		if (this != &s){
			char* temp=new char[s._capacity+1];	
			strcpy(temp, s._str);
			delete[] _str;
			_str = temp;
			_capacity = s._capacity;
			_size = s._size;
		}
		return *this;
	}
	~String(){
		if (_str!=nullptr )
		{
			delete[] _str;
			_str = nullptr;
		}
	}
	//容量相关的函数
	void Swap(String& s2){
		swap(_capacity, s2._capacity);
		swap(_size, s2._size);
		swap(_str, s2._str);
	}
	size_t capacity(){
		return _capacity;
	}
	size_t size(){
		return _size;
	}
	bool empty(){
		return _size == 0;
	}
	void resize(size_t n, char c = '\0'){
		if ((int)n > _size)//说明要扩容
		{
			if((int)n>_capacity)
				reserve(n + 1);
			memset(_str+_size, c, n - _size);
			
		}
		_size = n;

	}
	void reserve(size_t n){
		if (n > _capacity){
			char* newadd = new char[n+1];
			strcpy(newadd, _str);
			delete[] _str;
			_str = newadd;
			newadd = nullptr;
			_capacity = n-1;
		}
	}
	//迭代器
	typedef char* iterator;
	typedef char* reverse_iterator;
	iterator begin(){
		return _str;
	}
	iterator end(){
		return _str + _size - 1;
	}
	//访问元素的相关函数
	char* operator [](size_t n){
		if (n > _size)
			return _str + _size;
		else return _str + n - 1;
	}
	//修改元素的相关操作
	void push_back(char c)
	{
		if ( _size+1 > _capacity)
			reserve( _size + 2);
		_str[_size++] = c;
		_str[_size] = '\0';
	}
	void append(size_t n, char c)
	{
		while (n)
		{
			push_back(c);
			n--;
		}
		
		_size += n;
	}
	void append(char* str){ 
		if (strlen(str) + _size > _capacity){
			reserve(strlen(str) + _size+1);
			
		}
		strcat(_str, str);
		_size = strlen(str )+_size;
		_capacity = _size;
	}
	void clear()
	{
		char* newadd=new char[strlen(_str)+1];
		delete[] _str;
		_str = newadd;
		_size = 0;
	}
	//其他
	size_t find(char c, size_t pos)const
	{
		for (size_t i = pos; i <= _size; i++)
		{	
			if (c == _str[i - 1])
				return i;
		}
		return false;

	}
	size_t find(char* str, size_t pos)const
	{
		assert(str || pos <= _size);
		char* it1 = _str;
		char* it2 = str;
		for (size_t i = pos; i < _size;i++)
		{
			it1 = _str + i - 1;
			while (it1 || it2){
				if (*it1 == *it2)
				{
					++it1;
					++it2;
				}
				else
					break;
			}
			if (*it2 == '\0')
				return i;
		}
		return false;	
	}
	
private:
	char* _str;
	size_t _capacity;
	size_t _size;

};
//验证构造析构以及赋值运算符重载
void teststring1()
{
	String s1;
	String s2("hello");
	String s3(s2);
	String s4(5, 'b');
	s1 = s4;


}//验证append push_back
void teststring2()
{
	String s1("hello");
	s1.push_back(' ');
	//s1.append(2, 'x');
	s1.append("zjb!");
}//验证find
void teststring3(){
	String s1("I can't breath");
	int x=s1.find('c', 1);
	int y = s1.find("brea", 1);
}
int main(){
	teststring3();
	system("pause");
	return 0;
}

参考cpluspuls.com

猜你喜欢

转载自blog.csdn.net/m0_56910081/article/details/124257462