C++string模拟实现增删查改功能

一.reserve函数

1.1功能

改变当前sting对象空间容量的大小,如果需要改变的容量大小大于string对象的实际容量,就重新申请空间,扩容,否则就不需要扩容。

1.2返回值

无返回值

1.3实现逻辑

(1)判断需要扩容的容量n是否大于当前对象的实际容量

(2)在堆上申请大小n为的空间

(3)将对象中的字符串拷贝到在堆上新开辟的空间上,并释放该字符串指向的堆上的空间

(4)改变当前对象的实际容量值

实现代码如下所示

		//增容改变空间大小,只有当要增容的空间大小大于当前对象的容量的时候,才增容
		void reserve(size_t n)
		{
			if (n > _capacity)
			{
				char* tmp = new char[n + 1];
				strcpy(tmp, _str);
				delete[] _str;
				_str = tmp;

				_capacity = n;
			}
		}

实现结果:

C++string模拟实现增删查改功能_第1张图片

二.resize函数

2.1功能

改变当前sting对象的字符串的实际个数以及改变容量大小,并且初始化

2.2返回值

无返回值

2.3实现逻辑

(1)判断需要改变的容量n是否大于当前对象的实际个数

(2)如果n小于等于当前对象的实际个数,就将字符串的第n个字符赋值为字符串的结束标识符'\0',并改变字符串的实际个数为n

(3)如果n大于等于当前对象的实际个数并且大于当前对象的实际容量,就调用reserve函数扩容string的实际容量到n

(4)调用memset函数将扩容出来的空间,全部初始化为str,str默认初始值为'\0'

(5)再改变当前对象的实际大小为n,将字符串的第n个字符赋值为字符串的结束标识

实现代码如下所示


		//改变字符串的实际个数以及改变容量大小,并且初始化
		void resize(size_t n, char str = '\0')
		{
			if (n <= size())
			{
				_str[n] = '\0';
				_size = n;
			}
			else
			{
				if (n > capacity())
				{
					reserve(n);
				}
				memset(_str + _size, str, n - _size);
				_size = n;
				_str[_size] = '\0';
			}
		}

 实现结果:

C++string模拟实现增删查改功能_第2张图片

三.insert函数(append,push,+=重载函数可复用该函数)

3.1功能

在string字符串中的任意位置插入单个字符或是字符串,所以它有两个重载函数

3.2返回值

返回插入字符或是字符串之后的string对象

3.3实现逻辑

(1)判断需要插入的字符串的长度(len)加上插入的下标的值的和n是否大于当前对象的实际容量

(2)如果n大于当前对象的实际容量,就将对象的实际容量扩为n

(3)声明一个变量end,它是该对象的字符串中的最后一个元素('\0')移len个位后的后一个下标,这样end永远指向需要移位的元素的下一个位置

(4)进行数组移位操作,将对象中的字符串移位至len个元素之后

(5)通过调用strncpy(该函数可以将一个字符串中的n个元素拷贝至另一个字符串中)函数,再将需要插入的字符串拷贝至当前对象的字符串中,然后改变字符串的字符实际个数

实现代码如下所示

		//在任意位置插入字符串
		string& insert(size_t pos, const char* str)
		{
			assert(pos <= _size);
			size_t len = strlen(str);
			if (len + _size > _capacity)
			{
				reserve(len + _size);
			}
			size_t end = _size + len + 1;
			while (end > pos + len)
			{
				_str[end - 1] = _str[end - len - 1];
				end--;
			}
			strncpy(_str + pos, str, len);
			_size += len;
			return *this;
		}
		//在任意位置插入字符
		string& insert(size_t pos, char ch)
		{
			assert(pos <= _size);
			if (_size == _capacity)
			{
				_capacity == 0 ? reserve(4) : reserve(2 * _capacity);
			}
			size_t end = _size + 1;//此处不能使end = _size,因为当end = pos时,end--,就会发生数组越界
			while (end > pos)
			{
				_str[end] = _str[end - 1];
				end--;
			}
			_str[pos] = ch;
			_size++;
			return *this;
		}

 实现结果:

C++string模拟实现增删查改功能_第3张图片

 四.erase函数

4.1功能

从sting字符串的第pos个下标开始,删除长度为len的数据

4.2返回值

返回删除字符之后的string对象

4.3实现逻辑

(1)如果开始删除的数据的下标pos加上需要删除的个数len大于等于字符串的实际个数大小,就将下标为pos的数据赋值为字符串结束标识符('\0')

(2)否则就调用strycpy函数,将字符串数组中pos+len后的数据拷贝到pos下标处

(3)改变对象中的实际元素个数_size的值

(4)返回当前对象

实现代码如下所示

		//删除字符串
		string& erase(size_t pos = 0, size_t len = npos)
		{
			assert(pos < _size);
			if (pos + len >= _size)
			{
				_str[pos] = '\0';
				_size = pos;
			}
			else
			{
				strcpy(_str + pos, _str + pos + len);
				//strncpy(_str + pos, _str + pos + len, _size - pos - len + 1);
				_size -= len;
			}
			return *this;
		}
		//清除字符串
		void clear()
		{
			_str[0] = '\0';
			_size = 0;
		}

 实现结果:

C++string模拟实现增删查改功能_第4张图片

 五.find函数

5.1功能

从sting字符串中找到对应的字符和字符串

5.2返回值

找到返回首字母的下标,如果没找到就返回-1

5.3实现逻辑

查找单个字符:

(1)通过迭代器遍历每一个字符

(2)找到对应字符,返回字符下标

(3)如果没找到就返回-1

查找字符串:

(1)通过strstr函数,找到字符串在该string字符串里面的首字母的指针

(2)通过得到的指针,返回它在字符串中的位置

实现代码如下所示

		//查找字符
		size_t find(char ch) const
		{
			auto it = begin();
			while (it != end())
			{
				if (*it == ch)
				{
					return (it - _str);
				}
				it++;
			}
			return npos;
		}
		//查找字符串
		size_t find(const char* str) const
		{
			char* res = strstr(_str, str);
			if (res != nullptr)
			{
				return (res - _str);
			}
			return npos;
		}

 实现结果:

C++string模拟实现增删查改功能_第5张图片

六.【】访问限定符重载 

6.1功能

通过对象[ int n ]来实现对字符串里指定元素的访问和修改

6.2返回值

根据【】里的值,返回当前字符串中的指定的元素

6.3实现逻辑

直接返回下标为pos的字符串元素的引用

实现代码如下所示

		//2.取值符号[]重载
		char& operator[](size_t pos)
		{
			assert(pos < _size);
			return _str[pos];
		}

  实现结果:

C++string模拟实现增删查改功能_第6张图片

你可能感兴趣的:(C++,c++)